"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' );
} );
}
我试图将 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' );
} );
}