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

如何通过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为空,大概率是这两个原因:

  1. 请求格式误解:当用WWWForm上传文件时,Unity会自动发送multipart/form-data格式请求,Django会将文件数据单独解析到request.FILES,只有纯文本字段才会在request.POST里。
  2. 路径或文件读取错误:如果Unity端没正确读取到图片字节,表单可能只发送了空数据,导致Django端没有解析到任何内容。

内容的提问来源于stack exchange,提问作者Boosil-guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:16:03