You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:25:35