如何基于API返回的MP3 URL下载并保存音频文件?
如何下载并保存MP3音频文件
基于你现有的Django APIView 代码,已经通过第三方API拿到了MP3的下载链接,接下来可以通过以下两种方式完成下载保存的需求:
方式1:将MP3保存到服务器本地
修改视图代码,在拿到MP3 URL后,发起请求下载音频内容并写入本地文件:
import os import requests from django.conf import settings from django.http import JsonResponse from rest_framework.views import APIView from decouple import config class UserSearchView(APIView): def get(self, request, link): # 调用第三方API获取MP3 URL base_url = config('BASE_URL') querystring = {"track_url": link} headers = { "X-RapidAPI-Key": config('API_KEY'), "X-RapidAPI-Host": config('API_HOST') } try: api_response = requests.get(base_url, headers=headers, params=querystring) api_response.raise_for_status() data = api_response.json() mp3_url = data.get("url") if not mp3_url: return JsonResponse({"error": "未获取到有效的MP3链接"}, status=400) # 下载MP3音频内容 mp3_response = requests.get(mp3_url) mp3_response.raise_for_status() # 保存到服务器本地(示例路径:项目根目录下的media/mp3s文件夹) save_dir = os.path.join(settings.MEDIA_ROOT, "mp3s") os.makedirs(save_dir, exist_ok=True) filename = os.path.basename(mp3_url) save_path = os.path.join(save_dir, filename) with open(save_path, "wb") as f: f.write(mp3_response.content) return JsonResponse({ "message": "MP3保存成功", "local_path": save_path, "filename": filename }) except requests.exceptions.RequestException as e: return JsonResponse({"error": f"请求失败: {str(e)}"}, status=500) except Exception as e: return JsonResponse({"error": f"未知错误: {str(e)}"}, status=500)
方式2:直接返回MP3给用户下载(不保存到服务器)
如果不需要在服务器留存文件,可直接将音频内容作为响应返回,触发浏览器下载:
import os import requests from django.http import HttpResponse from rest_framework.views import APIView from decouple import config class UserSearchView(APIView): def get(self, request, link): base_url = config('BASE_URL') querystring = {"track_url": link} headers = { "X-RapidAPI-Key": config('API_KEY'), "X-RapidAPI-Host": config('API_HOST') } try: api_response = requests.get(base_url, headers=headers, params=querystring) api_response.raise_for_status() data = api_response.json() mp3_url = data.get("url") if not mp3_url: return HttpResponse("未获取到有效的MP3链接", status=400) # 下载MP3内容并返回给用户 mp3_response = requests.get(mp3_url) mp3_response.raise_for_status() # 设置响应头触发下载 filename = os.path.basename(mp3_url) response = HttpResponse(mp3_response.content, content_type="audio/mpeg") response["Content-Disposition"] = f'attachment; filename="{filename}"' return response except requests.exceptions.RequestException as e: return HttpResponse(f"请求失败: {str(e)}", status=500) except Exception as e: return HttpResponse(f"未知错误: {str(e)}", status=500)
注意事项
- 方式1需要确保Django项目配置了
MEDIA_ROOT,可在settings.py中添加:MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' - 处理大文件时,建议使用流式下载(
requests.get(mp3_url, stream=True))分块写入文件,避免内存占用过高。
内容的提问来源于stack exchange,提问作者Riccardo
相关产品推荐
相关产品推荐

