如何通过DRF发送PDF文件?Base64转文件后API调用遇阻求助
问题排查与修正代码
你的代码存在几个关键问题,导致无法正确发送form-data格式的文件请求,以下是修正后的代码及问题说明:
修正后的代码
from django.http import Response import base64 import requests from io import BytesIO def sendDocs(photoBack): try: # 解码Base64格式的PDF数据 decoded_data = base64.b64decode(photoBack) # 用BytesIO在内存中处理文件,无需写入本地磁盘 pdf_file = BytesIO(decoded_data) pdf_file.name = "photoBack.pdf" url = f'https://file.shinhanfinance.kz/files/shinhanfinance/add?client={1013246509}' headers = {'bsauth': 'key'} # 不要手动设置Content-Type,requests会自动处理 # 构造符合form-data要求的files参数 files = {"file": (pdf_file.name, pdf_file, 'application/pdf')} # 发送POST请求,使用files参数传递文件 response = requests.post(url, files=files, headers=headers) response.raise_for_status() # 主动抛出HTTP异常,便于排查请求错误 return Response({"status": "success", "response": response.json()}) except Exception as e: # 返回具体异常信息,方便调试 return Response({"error": str(e)})
原代码的核心问题分析
- 手动设置
Content-Type错误:使用requests的files参数时,库会自动生成包含边界符的multipart/form-data头,手动设置会覆盖正确的头信息,导致服务端无法解析请求。 - 文件操作逻辑错误:原代码写入文件后立即关闭,后续用已关闭的文件对象创建
HttpResponse完全无效,且无需用HttpResponse封装文件,直接使用内存文件对象即可。 - 请求参数使用错误:form-data上传文件必须用
files参数,原代码用data参数传递文件,不符合接口要求。 - 异常处理过于宽泛:无差别捕获所有异常,无法定位具体错误原因,改为捕获具体异常并返回信息,便于调试。
- 不必要的本地磁盘写入:用
BytesIO在内存中处理解码后的PDF,避免磁盘IO操作,提升效率。
内容的提问来源于stack exchange,提问作者Dias
相关产品推荐
相关产品推荐

