"MulterError: Unexpected field" when using together Unity and Node.js server

"MulterError: Unexpected field" when using together Unity and Node.js server

我试图将 Unity 生成的单个文件上传到 Node.js 生成的 Web 服务器,但出现错误。

web服务器的代码如下。它只是处理文件上传请求。

const express = require('express');
const mysql   = require('mysql');
const multer  = require('multer');
const fs      = require('fs');
const app     = express();

app.use(express.json());
app.use(express.static(__dirname + '/uploads'));
app.listen(3005, () => {
  console.log('server started');
});

let storage = multer.diskStorage({
  destination: function(req, file, callback) {
    callback(null, 'uploads/');
  },
  filename: function(req, file, callback) {
    callback(null, file.originalname);  
  }
});

let upload = multer({
  storage : storage
});

app.post('/fileUpload', upload.single('file'), (req, res, next) => {
  let file = req.file;
});

这是 Unity 辅助代码。

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

public class FileUpload : MonoBehaviour
{
    public string filePath;

    public void UploadProcess()
    {
        StartCoroutine(Upload());
    }

    IEnumerator Upload()
    {
        List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
        formData.Add(new MultipartFormFileSection("file", filePath));

        UnityWebRequest www = UnityWebRequest.Post("http://localhost:3005/fileUpload", formData);
        yield return www.SendWebRequest();

        if(www.isNetworkError || www.isHttpError)
        {
            Debug.Log(www.error);
        }
        else 
        {
            Debug.Log("Form upload complete!");
        }
    }
}

当我运行代码时,Unity输出以下错误:

HTTP/1.1 500 Internal Server Error

Web 服务器也输出以下错误:

MulterError : Unexpected field at wrappedFileFilter ...

我不知道到底哪里出了问题。

multer 包似乎有问题。如果我使用 formidable 而不是 multer 似乎问题就解决了。

Unity协程上传文件:

private IEnumerator UploadFile () {
    List < IMultipartFormSection > formData = new List < IMultipartFormSection > ();
    byte [] arr = File.ReadAllBytes ( Path.Combine ( Application.dataPath, "image.jpg" ) );
    formData.Add ( new MultipartFormFileSection ( "background.jpg", arr ) );
    
    UnityWebRequest request = UnityWebRequest.Post ( "http://127.0.0.1:9000/upload", formData );
    yield return request.SendWebRequest ();
    
    if ( request.result != UnityWebRequest.Result.Success ) {
        Debug.LogError ( $"<color=red>Upload error: {request.error}</color>" );
    } else {
        Debug.Log ( "<color=cyan>Upload successful</color>" );
    }
}

这是“formidable”部分的nodejs代码,其余与你的相同:

const formidable = require ( 'formidable' );
const incomingForm = formidable.IncomingForm;


app.post ( '/upload', function ( req, res ) ) {
    let form = new incomingForm ();
    form.uploadDir = "upload"; // This is the directory you have to create manually.
    form.parse ( req, function ( err, fields, files ) {
        if ( err ) {
            console.log ( 'Some error: ', err );
        }
        console.log ( 'File saved' );
    } );
}