Estoy trabajando en cargar un archivo a mi aplicación usando el módulo multer npm.
La función multer que he definido es permitir que se cargue un solo archivo en el sistema de archivos. Todo funciona durante el tiempo de ejecución; El problema es que después de cargar el archivo aparece un error a continuación. Cualquier consejo apreciado sobre dónde buscar.
Error:
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"
}
}
La función
<NAME>
que use en multerupload.single(<NAME>)
debe ser la misma que la que usa<input type="file" name="<NAME>" ...>
.Entonces necesitas cambiar
var type = upload.single('file')
a
var type = upload.single('recfile')
en tu app.js
Espero que esto ayude.
fuente
Un seguimiento a la respuesta de Vincent.
No es una respuesta directa a la pregunta ya que la pregunta está usando un formulario.
Para mí, no fue el nombre de la etiqueta de entrada lo que se usó, sino el nombre al agregar el archivo a formData.
archivo frontal
archivo de servicio web:
fuente
formData
nombre clave sea el mismo que elupload
argumento clave es crucial. Funciona para mi ahora.¡ya que se están cargando 2 imágenes! uno con extensión de archivo y otro sin extensión. eliminar tmp_path (archivo sin extensión)
después
src.pipe(dest);
agregue el siguiente código
fs.unlink(tmp_path); //deleting the tmp_path
fuente
Esto para la API podría usar
Esto también funciona bien en Postman pero el archivo no viene con la extensión .jpg ¿Algún consejo? Como se comenta a continuación
Esta es la característica predeterminada de multer si carga un archivo sin extensión, sin embargo, le proporciona el objeto del archivo, mediante el cual puede actualizar la extensión del archivo.
fuente
Desafortunadamente, el mensaje de error no proporciona información clara sobre cuál es el verdadero problema. Para eso, se requiere alguna depuración.
Desde el seguimiento de la pila, aquí está el origen del error en el
multer
paquete:Y la traducción extraña (posiblemente errónea) aplicada aquí es la fuente del mensaje en sí ...
filesLeft
es un objeto que contiene el nombre del campo que su servidor espera yfile.fieldname
contiene el nombre del campo proporcionado por el cliente. El error se produce cuando hay una falta de coincidencia entre el nombre de campo proporcionado por el cliente y el nombre de campo esperado por el servidor.La solución es cambiar el nombre en el cliente o en el servidor para que los dos estén de acuerdo.
Por ejemplo, cuando se usa
fetch
en el cliente ...Y el servidor tendría una ruta como la siguiente ...
Observe que es
myfile
cuál es el nombre común (en este ejemplo).fuente
Resuelvo estos problemas buscando el nombre que pasé en mi solicitud
Estaba enviando el cuerpo:
y esperaba:
entonces, arreglo el nombre que se envía a pedido
fuente
Nombre de archivo diferente que se publicó como " archivo " en
<input type="file" name='recfile' placeholder="Select file"/>
y se recibió como " archivo " enupload.single('file')
Solución : asegúrese de que tanto el archivo enviado como el recibido sean similares
upload.single('recfile')
fuente
En mi caso, esto sucedía porque cambié el nombre de un parámetro
swagger.yaml
pero no volví a cargar la página de documentos.Por lo tanto, estaba probando la API con un parámetro de entrada inesperado.
Larga historia corta, F5es mi amigo.
fuente
probablemente no esté dando el mismo nombre que mencionó en el
upload.single('file')
.fuente
En mi caso, tenía 2 formas en diferentes vistas y diferentes archivos de enrutador. El primer enrutador utilizó el campo de nombre con la vista uno y su nombre de archivo era "inputGroupFile02". La segunda vista tenía otro nombre para la entrada de archivos. Por alguna razón, Multer no le permite establecer diferentes nombres en diferentes vistas, por lo que decidí usar el mismo nombre para la entrada del archivo en ambas vistas.
fuente