Estou trabalhando no upload de um arquivo para o meu aplicativo usando o módulo multer npm.
A função multer que defini é permitir que um único arquivo seja carregado no sistema de arquivos. Tudo funciona durante o tempo de execução; o problema ocorre após o upload do arquivo. Recebo um erro abaixo. Qualquer conselho apreciado sobre onde procurar.
Erro:
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"
}
}
A função que
<NAME>
você usa na multerupload.single(<NAME>)
deve ser a mesma que você usa<input type="file" name="<NAME>" ...>
.Então você precisa mudar
var type = upload.single('file')
para
var type = upload.single('recfile')
em você app.js
Espero que isto ajude.
fonte
Um seguimento da resposta de vincent.
Não é uma resposta direta à pergunta, pois ela está usando um formulário.
Para mim, não era o nome da tag de entrada usada, mas o nome ao anexar o arquivo ao formData.
arquivo front-end
arquivo de serviço da web:
fonte
formData
nome da chave seja o mesmo que oupload
argumento da chave. Trabalha para mim agora.desde que 2 imagens estão sendo carregadas! um com extensão de arquivo e outro arquivo sem extensão. excluir tmp_path (arquivo sem extensão)
depois de
src.pipe(dest);
adicione código abaixo
fs.unlink(tmp_path); //deleting the tmp_path
fonte
Isso para a API você pode usar
Isso também funciona bem no Postman, mas o arquivo não vem com a extensão .jpg. Como comentado abaixo
Esse é o recurso padrão do multer se o upload de arquivo sem extensão for fornecido, no entanto, você fornecerá o objeto de arquivo, usando o qual você poderá atualizar a extensão do arquivo.
fonte
Infelizmente, a mensagem de erro não fornece informações claras sobre qual é o verdadeiro problema. Para isso, é necessária alguma depuração.
No rastreamento da pilha, aqui está a origem do erro no
multer
pacote:E a tradução estranha (possivelmente equivocada) aplicada aqui é a fonte da própria mensagem ...
filesLeft
é um objeto que contém o nome do campo que seu servidor está esperando efile.fieldname
contém o nome do campo fornecido pelo cliente. O erro é gerado quando há uma incompatibilidade entre o nome do campo fornecido pelo cliente e o nome do campo esperado pelo servidor.A solução é alterar o nome no cliente ou no servidor para que os dois concordem.
Por exemplo, ao usar
fetch
no cliente ...E o servidor teria uma rota como a seguinte ...
Observe que esse é
myfile
o nome comum (neste exemplo).fonte
Resolvo esses problemas procurando o nome que passei na minha solicitação
Eu estava enviando no corpo:
e eu esperava:
então, eu corrijo o nome que um envio a pedido
fonte
Nome de arquivo diferente que foi postado como " refil "
<input type="file" name='recfile' placeholder="Select file"/>
e recebido como " arquivo " emupload.single('file')
Solução : verifique se os arquivos enviados e recebidos são semelhantes
upload.single('recfile')
fonte
No meu cenário, isso estava acontecendo porque renomeei um parâmetro,
swagger.yaml
mas não recarreguei a página de documentos.Portanto, eu estava tentando a API com um parâmetro de entrada inesperado.
Para encurtar a história, F5é meu amigo.
fonte
provavelmente você não está dando o mesmo nome que você mencionou no
upload.single('file')
.fonte
No meu caso, eu tinha 2 formulários em diferentes visualizações e diferentes arquivos de roteador. O primeiro roteador usou o campo de nome com a exibição um e seu nome de arquivo era "inputGroupFile02". A segunda visualização tinha outro nome para a entrada do arquivo. Por alguma razão, o Multer não permite que você defina nomes diferentes em modos de exibição diferentes, então decidi usar o mesmo nome para a entrada do arquivo nos dois modos de exibição.
fonte