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

Python/Django如何上传文件、修改后返回给客户端?

解决Django中返回处理后图片给客户端的问题

嘿,看你已经搞定了图片上传和resize的核心流程,就差最后一步把处理好的图片返回给客户端了对吧?这在Django里其实很容易实现,我给你分享两种实用的方案,还附带客户端接收的优化代码:

方案一:用HttpResponse返回图片二进制内容

这是最直接的方式,把处理后的图片存入内存缓冲区,再通过HttpResponse返回,同时设置正确的响应头让客户端识别图片类型。

服务端完整视图代码

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from PIL import Image
import io

@csrf_exempt  # 测试阶段用,生产环境请替换成CSRF验证逻辑
def upload_and_resize(request):
    if request.method != 'POST':
        return HttpResponse(status=405)  # 只接受POST请求
    
    try:
        # 获取上传文件和尺寸参数
        uploaded_file = request.FILES['file']
        target_width = int(request.POST.get('m'))
        target_height = int(request.POST.get('n'))
        
        # 打开并调整图片尺寸
        with Image.open(uploaded_file) as img:
            resized_img = img.resize((target_width, target_height))
            
            # 将处理后的图片写入内存缓冲区
            buffer = io.BytesIO()
            # 保持原图片格式,避免强制转格式导致的问题
            resized_img.save(buffer, format=img.format)
            buffer.seek(0)  # 将指针移到缓冲区开头
            
            # 构造响应
            response = HttpResponse(
                buffer,
                content_type=f'image/{img.format.lower()}'
            )
            # 可选:如果希望浏览器直接下载图片而不是预览,添加下面这行
            # response['Content-Disposition'] = f'attachment; filename="resized.{img.format.lower()}"'
            return response
    
    except Exception as e:
        # 处理异常(比如非图片文件、参数无效等)
        return HttpResponse(f"处理失败:{str(e)}", status=400)

客户端优化代码(保存返回的图片)

你的客户端现在只打印了响应状态,其实可以直接把响应内容保存为图片文件:

import requests

testFile = "<你的本地图片路径>"
api_url = 'http://localhost:9999/upload'

with open(testFile, 'rb') as f:
    files = {'file': f}
    r = requests.post(api_url, files=files, data={"m":10,"n":15})

if r.status_code == 200:
    # 保存处理后的图片到本地,文件名可以自定义
    with open('resized_output.jpg', 'wb') as output_f:
        output_f.write(r.content)
    print("处理后的图片已成功保存!")
else:
    print(f"请求出错,状态码:{r.status_code},错误信息:{r.text}")

方案二:用FileResponse返回(适合大文件)

如果你的图片尺寸较大,用Django的FileResponse会更高效,它支持流式传输,代码和方案一几乎一样,只是把HttpResponse换成FileResponse:

from django.http import FileResponse

# 前面的处理逻辑和方案一相同,到构造响应部分
response = FileResponse(
    buffer,
    content_type=f'image/{img.format.lower()}'
)
# 同样可以添加Content-Disposition头控制下载/预览
return response

注意事项

  • 确保已经安装了Pillow:pip install pillow,这是Django处理图片的常用库
  • 生产环境不要用@csrf_exempt,建议通过表单提交或在请求头中携带CSRF token来验证
  • 可以添加更多参数校验(比如尺寸不能为负数、上传文件类型检查),让接口更健壮

内容的提问来源于stack exchange,提问作者ber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:32:10