Saya sedang mengunggah file ke aplikasi saya menggunakan modul multer npm.
Fungsi multer yang telah saya tetapkan adalah untuk memungkinkan satu file diunggah ke sistem file. Semuanya berfungsi selama waktu berjalan; masalahnya adalah setelah saya mengunggah file saya mendapatkan kesalahan di bawah ini. Setiap saran dihargai di mana mencarinya.
Kesalahan:
Unexpected field
Error: Unexpected field
at makeError (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\lib\make-error.js:12:13)
at wrappedFileFilter (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\index.js:39:19)
at Busboy.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\lib\make-middleware.js:97:7)
at Busboy.emit (events.js:118:17)
at Busboy.emit (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\lib\main.js:31:35)
at PartStream.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\lib\types\multipart.js:205:13)
at PartStream.emit (events.js:107:17)
at HeaderParser.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\Dicer.js:51:16)
at HeaderParser.emit (events.js:107:17)
at HeaderParser._finish (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:70:8)
app.js
var multer = require('multer');
var app = express();
var fs = require('fs');
//. . .
var upload = multer({ dest: 'upload/'});
var type = upload.single('file');
app.post('/upload', type, function (req,res) {
var tmp_path = req.files.recfile.path;
var target_path = 'uploads/' + req.files.recfile.name;
fs.readFile(tmp_path, function(err, data)
{
fs.writeFile(target_path, data, function (err)
{
res.render('complete');
})
});
Index.hbs
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name='recfile' placeholder="Select file"/>
<br/>
<button>Upload</button>
</form>
#Package.json
"dependencies": {
"body-parser": "~1.13.2",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"easy-zip": "0.0.4",
"express": "~4.13.1",
"hbs": "~3.1.0",
"less-middleware": "1.0.x",
"morgan": "~1.6.1",
"multer": "~1.0.0",
"serve-favicon": "~2.3.0"
}
}
The
<NAME>
Anda gunakan dalam multer iniupload.single(<NAME>)
fungsi harus sama dengan yang Anda gunakan dalam<input type="file" name="<NAME>" ...>
.Jadi, Anda perlu berubah
var type = upload.single('file')
untuk
var type = upload.single('recfile')
di app.js Anda
Semoga ini membantu.
sumber
Tindak lanjut jawaban vincent.
Bukan jawaban langsung untuk pertanyaan karena pertanyaan menggunakan formulir.
Bagi saya, itu bukan nama tag input yang digunakan, tetapi nama saat menambahkan file ke formData.
file ujung depan
file layanan web:
sumber
formData
nama kuncinya sama denganupload
argumen kuncinya sangat penting. Ini bekerja untuk saya sekarang.karena 2 gambar diunggah! satu dengan ekstensi file dan file lainnya tanpa ekstensi. untuk menghapus tmp_path (file tanpa ekstensi)
setelah
src.pipe(dest);
tambahkan kode di bawah ini
fs.unlink(tmp_path); //deleting the tmp_path
sumber
Ini untuk Api yang bisa kamu gunakan
Ini juga berfungsi dengan baik digunakan pada Postman tetapi file tidak disertai dengan ekstensi .jpg Advis? Seperti yang dikomentari di bawah ini
Ini adalah fitur default dari multer jika mengunggah file tanpa ekstensi, namun, memberi Anda objek file, yang dengannya Anda dapat memperbarui ekstensi file.
sumber
Sayangnya, pesan kesalahan tidak memberikan informasi yang jelas tentang apa masalah sebenarnya. Untuk itu, diperlukan debugging.
Dari jejak stack, inilah asal-usul kesalahan dalam
multer
paket:Dan terjemahan aneh (mungkin salah) yang diterapkan di sini adalah sumber dari pesan itu sendiri ...
filesLeft
adalah objek yang berisi nama bidang yang diharapkan server Anda, danfile.fieldname
berisi nama bidang yang disediakan oleh klien. Kesalahan terjadi ketika ada ketidaksesuaian antara nama bidang yang disediakan oleh klien dan nama bidang yang diharapkan oleh server.Solusinya adalah mengubah nama pada klien atau server sehingga keduanya setuju.
Misalnya, ketika menggunakan
fetch
pada klien ...Dan server akan memiliki rute seperti berikut ...
Perhatikan bahwa itu adalah
myfile
nama umum (dalam contoh ini).sumber
Saya memecahkan masalah ini mencari nama yang saya berikan pada permintaan saya
Saya mengirim pada tubuh:
dan saya diharapkan untuk:
jadi, saya memperbaiki nama yang dikirim berdasarkan permintaan
sumber
Nama file berbeda yang diposkan sebagai " recfile " di
<input type="file" name='recfile' placeholder="Select file"/>
dan diterima sebagai " file " diupload.single('file')
Solusi : pastikan file yang dikirim dan diterima sama
upload.single('recfile')
sumber
Dalam skenario saya ini terjadi karena saya mengganti nama parameter
swagger.yaml
tetapi tidak memuat ulang halaman dokumen.Karenanya saya mencoba API dengan parameter input yang tidak terduga.
Singkat cerita, F5adalah teman saya.
sumber
mungkin Anda tidak memberikan nama yang sama seperti yang Anda sebutkan di
upload.single('file')
.sumber
Dalam kasus saya, saya memiliki 2 formulir dalam tampilan differents dan differents file router. Router pertama menggunakan bidang nama dengan tampilan satu dan nama filenya adalah "inputGroupFile02". Tampilan kedua memiliki nama lain untuk input file. Untuk beberapa alasan Multer tidak memungkinkan Anda mengatur nama differents dalam tampilan yang berbeda, jadi saya memutuskan untuk menggunakan nama yang sama untuk input file di kedua tampilan.
sumber