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请求")
三、关键排查步骤
- 检查图片路径是否正确:在Unity编辑器里,
Application.dataPath指向项目的Assets文件夹,确保file.png确实在这个路径下,不然读取到的是空字节数组,自然发送空请求。 - 抓包验证请求格式:用Fiddler或Wireshark抓Unity发送的请求,查看请求头里的
Content-Type是否包含正确的boundary,请求体里是否有图片的字节数据和正确的表单字段标识。 - Unity版本坑:2017.3的UnityWebRequest对multipart格式的处理有小bug,如果上面的代码还是不行,可以尝试手动构建multipart请求体(用
UploadHandlerRaw),不过一般用正确的构造函数就能解决。
试试上面的方案,应该能解决你请求体为空的问题!
内容的提问来源于stack exchange,提问作者jckstl
相关产品推荐
相关产品推荐

