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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:35:10