如何通过UnityWebRequest.Post将Unity图片传输至Django服务器?求代码示例
我来帮你搞定这个Unity传图片到Django的问题~下面是经过验证的代码示例和关键说明:
Unity 上传图片到 Django 服务器的正确实现
一、Unity 端 C# 完整代码
修正你的请求逻辑,确保同时正确传递表单字段和图片文件:
using UnityEngine; using System.IO; using UnityEngine.Networking; public class ImageUploader : MonoBehaviour { public void StartUpload() { StartCoroutine(UploadImageToServer()); } IEnumerator UploadImageToServer() { // 替换成你实际的图片路径,建议用Unity的路径API避免跨平台问题 string imagePath = Application.persistentDataPath + "/"; string imageFileName = "Sohyeluv.jpg"; // 读取图片字节 if (!File.Exists(imagePath + imageFileName)) { Debug.LogError("图片不存在,请检查路径"); yield break; } byte[] imageBytes = File.ReadAllBytes(imagePath + imageFileName); // 创建表单,自动处理multipart/form-data格式 WWWForm form = new WWWForm(); // 添加普通文本字段(会出现在Django的request.POST中) form.AddField("Things", 10); // 添加图片文件(会出现在Django的request.FILES中) form.AddBinaryData("uploaded_image", imageBytes, imageFileName, "image/jpeg"); // 发送POST请求,替换成你的Django接口地址 using (UnityWebRequest www = UnityWebRequest.Post("http://127.0.0.1:8000/testforunity/upload/", form)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.LogError($"上传失败: {www.error}"); } else { Debug.Log($"上传成功,服务器返回: {www.downloadHandler.text}"); } } } }
二、Django 端 views.py 处理代码
重点:文件数据不在request.POST里,而是在request.FILES中,普通文本字段才会被解析到request.POST:
from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt import os from django.conf import settings @csrf_exempt # 测试阶段临时关闭CSRF验证,上线后请配置正确的CSRF规则 def handle_image_upload(request): if request.method == "POST": # 获取普通表单字段 things_value = request.POST.get("Things") print(f"收到的Things字段值: {things_value}") # 获取上传的图片文件 uploaded_image = request.FILES.get("uploaded_image") if uploaded_image: # 保存图片到服务器(需提前配置Django的MEDIA_ROOT) save_dir = os.path.join(settings.MEDIA_ROOT, "uploaded_images") os.makedirs(save_dir, exist_ok=True) save_path = os.path.join(save_dir, uploaded_image.name) with open(save_path, "wb+") as dest_file: for chunk in uploaded_image.chunks(): dest_file.write(chunk) return JsonResponse({"status": "success", "message": "图片上传完成"}) else: return JsonResponse({"status": "error", "message": "未接收到图片文件"}) else: return JsonResponse({"status": "error", "message": "仅支持POST请求"})
三、关键问题说明
你之前看到request.POST为空,大概率是这两个原因:
- 请求格式误解:当用
WWWForm上传文件时,Unity会自动发送multipart/form-data格式请求,Django会将文件数据单独解析到request.FILES,只有纯文本字段才会在request.POST里。 - 路径或文件读取错误:如果Unity端没正确读取到图片字节,表单可能只发送了空数据,导致Django端没有解析到任何内容。
内容的提问来源于stack exchange,提问作者Boosil-guy
相关产品推荐
相关产品推荐

