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

Unity 2017.3发送至Django的HTTP POST请求始终为空的问题

解决Unity 2017.3发送HTTP POST图片到Django时请求体为空的问题

嘿,我之前在Unity 2017.x版本里也踩过这个一模一样的坑——明明本地Django服务器能收到POST请求,但就是拿不到任何文件或数据!结合我当时的排查经验,给你几个关键的解决点:

一、Unity端:用对MultipartFormFileSection的构造函数

Unity 2017.3的MultipartFormFileSection有多个构造函数,如果参数传不对,会直接导致请求体格式错误,Django根本解析不到内容。一定要用带文件名和Content-Type的重载,这样Django才能识别为上传的文件。

正确的上传代码示例

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public class ImageUploader : MonoBehaviour
{
    IEnumerator UploadImageToServer()
    {
        string localServerUrl = "http://localhost:8000/your-upload-endpoint/";

        // 两种获取图片字节的方式选其一
        // 方式1:从Assets目录下的file.png读取字节
        byte[] imageBytes = File.ReadAllBytes(Application.dataPath + "/file.png");
        // 方式2:直接使用已有的byte[]数组
        // byte[] imageBytes = yourPreloadedImageByteArray;

        // 构建Multipart表单:关键是指定字段名、字节数组、文件名、Content-Type
        List<IMultipartFormSection> formSections = new List<IMultipartFormSection>();
        // 第一个参数是表单字段名(要和Django端接收的字段名完全一致)
        formSections.Add(new MultipartFormFileSection("uploaded_image", imageBytes, "file.png", "image/png"));

        UnityWebRequest uploadRequest = UnityWebRequest.Post(localServerUrl, formSections);
        
        // !重要提醒:不要手动设置Content-Type头,Unity会自动生成带正确boundary的头
        // 手动设置反而会破坏multipart格式,导致Django解析失败

        yield return uploadRequest.SendWebRequest();

        if (uploadRequest.isNetworkError || uploadRequest.isHttpError)
        {
            Debug.LogError("上传出错:" + uploadRequest.error);
        }
        else
        {
            Debug.Log("上传成功,服务器返回:" + uploadRequest.downloadHandler.text);
        }
    }

    // 比如在Start里触发上传
    void Start()
    {
        StartCoroutine(UploadImageToServer());
    }
}

二、Django端:正确接收文件

确保你的视图函数是从request.FILES里取文件,而不是request.body(除非你要手动处理原始字节)。另外,本地测试时可以暂时关闭CSRF中间件,避免请求被拦截(如果服务器能收到请求,这个可能不是问题,但还是提一下)。

Django视图示例

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

# 本地测试用csrf_exempt跳过CSRF验证
@csrf_exempt
def handle_image_upload(request):
    if request.method == "POST":
        # 检查表单字段名是否和Unity端一致(这里是"uploaded_image")
        if "uploaded_image" in request.FILES:
            uploaded_file = request.FILES["uploaded_image"]
            # 示例:保存文件到服务器本地
            with open(f"uploaded_{uploaded_file.name}", "wb+") as f:
                for chunk in uploaded_file.chunks():
                    f.write(chunk)
            return HttpResponse("文件接收成功!")
        else:
            # 排查用:打印原始请求体,看看Unity到底发了什么内容
            print("未识别到文件,原始请求体:", request.body)
            return HttpResponse("未收到上传的文件")
    return HttpResponse("请使用POST请求")

三、关键排查步骤

  1. 检查图片路径是否正确:在Unity编辑器里,Application.dataPath指向项目的Assets文件夹,确保file.png确实在这个路径下,不然读取到的是空字节数组,自然发送空请求。
  2. 抓包验证请求格式:用Fiddler或Wireshark抓Unity发送的请求,查看请求头里的Content-Type是否包含正确的boundary,请求体里是否有图片的字节数据和正确的表单字段标识。
  3. Unity版本坑:2017.3的UnityWebRequest对multipart格式的处理有小bug,如果上面的代码还是不行,可以尝试手动构建multipart请求体(用UploadHandlerRaw),不过一般用正确的构造函数就能解决。

试试上面的方案,应该能解决你请求体为空的问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:39:01