sourcetip

노드 멀티터 예기치 않은 필드

fileupload 2023. 5. 8. 22:25
반응형

노드 멀티터 예기치 않은 필드

저는 multter npm 모듈을 사용하여 제 앱에 파일을 업로드하는 작업을 하고 있습니다.

제가 정의한 multer 기능은 파일 시스템에 하나의 파일을 업로드할 수 있도록 하는 것입니다.실행 시간에는 모든 것이 작동합니다. 문제는 파일을 업로드한 후 아래 오류가 발생하는 것입니다.어디를 찾아야 하는지에 대한 조언은 감사합니다.

오류:

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');
  })
});

인덱스.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"
  }
}

<NAME>멀터즈에서 사용하는upload.single(<NAME>)함수는 에서 사용하는 함수와 동일해야 합니다.<input type="file" name="<NAME>" ...>.

그래서 당신은 변화가 필요합니다.

var type = upload.single('file')

로.

var type = upload.single('recfile')

당신의 앱에서.js.

name 속성을 가진 type= 파일이 전달된 매개 변수 이름과 동일해야 합니다.upload.single('attr')

var multer  = require('multer');
var upload = multer({ dest: 'upload/'});
var fs = require('fs');

/** Permissible loading a single file, 
    the value of the attribute "name" in the form of "recfile". **/
var type = upload.single('recfile');

app.post('/upload', type, function (req,res) {

  /** When using the "single"
      data come in "req.file" regardless of the attribute "name". **/
  var tmp_path = req.file.path;

  /** The original name of the uploaded file
      stored in the variable "originalname". **/
  var target_path = 'uploads/' + req.file.originalname;

  /** A better way to copy the uploaded file. **/
  var src = fs.createReadStream(tmp_path);
  var dest = fs.createWriteStream(target_path);
  src.pipe(dest);
  src.on('end', function() { res.render('complete'); });
  src.on('error', function(err) { res.render('error'); });

});

빈센트의 답변에 대한 후속 조치.

질문이 양식을 사용하고 있기 때문에 질문에 대한 직접적인 답변이 아닙니다.

저는 입력 태그의 이름이 아니라 파일을 Data 형식에 추가할 때의 이름을 사용했습니다.

프런트 엔드 파일

   var formData = new FormData();
   formData.append('<NAME>',this.new_attachments)

웹 서비스 파일:

   app.post('/upload', upload.single('<NAME>'),...

이것은 당신이 사용할 수 있는 API를 위한 것입니다.

 const express        = require('express');
 const bodyParser     = require('body-parser');
 const app = express();
 var multer = require('multer');
 const port = 8000;
 app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({ extended: true }));

 app.listen(port, ()=>{
 console.log('We are live on' + port);
 });

 var upload = multer({dest:'./upload/'});

 app.post('/post', upload.single('file'), function(req, res) {
  console.log(req.file);
 res.send("file saved on server");
 });

이것은 또한 포스트맨에서 사용되는 것은 괜찮지만 파일 확장자가 .jpg와 함께 제공되지 않습니다. 조언이 있습니까?아래에 언급된 것과 같이.

이 기능은 확장명이 없는 파일을 업로드하는 경우 멀티터의 기본 기능이지만 파일 확장명을 업데이트할 수 있는 파일 개체를 제공합니다.

var filename = req.file.filename; 
var mimetype = req.file.mimetype; 
mimetype = mimetype.split("/"); 
var filetype = mimetype[1]; 
var old_file = configUploading.settings.rootPathTmp+filename; 
var new_file = configUploading.settings.rootPathTmp+filename+'.'+filetype; 
rname(old_file,new_file);

입력의 이름 속성을 사용하는 대신 파일을 전달하는 데 사용하는 키를 사용합니다.

예:나의FormData개체:

클라이언트 측:

formData.append('file', fileBlob);

서버 측:

multer.single('file');

2개의 이미지가 업로드되고 있기 때문입니다!파일 확장명이 있는 파일과 확장명이 없는 다른 파일. tmp_path(확장명이 없는 파일)를 삭제합니다.

끝나고
src.pipe(dest);

아래 코드 추가

fs.unlink(tmp_path); //deleting the tmp_path

다음 위치에 "recfile"로 게시된 다른 파일 이름<input type="file" name='recfile' placeholder="Select file"/>그리고 "파일"로 수신됨upload.single('file')

솔루션: 보낸 파일과 받은 파일이 모두 유사한지 확인합니다.upload.single('recfile')

안타깝게도 오류 메시지는 실제 문제가 무엇인지에 대한 명확한 정보를 제공하지 않습니다.이를 위해 디버깅이 필요합니다.

스택 추적에서 오류의 원인은 다음과 같습니다.multer패키지:

function wrappedFileFilter (req, file, cb) {
  if ((filesLeft[file.fieldname] || 0) <= 0) {
    return cb(makeError('LIMIT_UNEXPECTED_FILE', file.fieldname))
  }

  filesLeft[file.fieldname] -= 1
  fileFilter(req, file, cb)
}

그리고 여기에 적용된 이상한 (잘못되었을 가능성이 있는) 번역은 메시지 자체의 원천입니다...

'LIMIT_UNEXPECTED_FILE': 'Unexpected field'

filesLeft서버가 예상하는 필드의 이름을 포함하는 개체입니다.file.fieldname클라이언트에서 제공한 필드의 이름을 포함합니다.클라이언트에서 제공한 필드 이름과 서버에서 제공한 필드 이름이 일치하지 않으면 오류가 발생합니다.

해결책은 클라이언트 또는 서버의 이름을 변경하여 둘이 동의하도록 하는 것입니다.

를 들어, 를들어를 사용할 때, 사할때를 합니다.fetch고객에게...

var theinput = document.getElementById('myfileinput')
var data = new FormData()
data.append('myfile',theinput.files[0])
fetch( "/upload", { method:"POST", body:data } )

그리고 서버는 다음과 같은 경로를 가질 것입니다.

app.post('/upload', multer(multerConfig).single('myfile'),function(req, res){
  res.sendStatus(200)
}

는 것을 하세요.myfile이는 일반적인 이름입니다(이 예에서는)

2022-2023 정답

FormData를 사용하고 배열로 작업할 때 multer 변수 이름에는 '[]'도 포함되어야 합니다. 이전에는 그렇지 않았습니다.

이전 코드:

const multerConfig = upload.fields([
    {name: 'photos', maxCount: 20}
])

2022+ 코드:

const multerConfig = upload.fields([
    {name: 'photos[]', maxCount: 20}
])

요청을 전달한 이름을 찾아 이 문제를 해결합니다.

시체를 보내려고 했어요

{thumbbail: <myimg>}

그리고 나는 다음과 같이 예상했습니다.

upload.single('thumbnail')

그래서, 나는 요청할 때 보내는 이름을 고칩니다.

내 시나리오에서는 매개 변수의 이름을 변경했기 때문에 이 문제가 발생했습니다.swagger.yaml문서 페이지를 다시 로드하지 않았습니다.

그래서 저는 예상치 못한 입력 파라미터로 API를 시도하고 있었습니다.
간단히 말해서, 제 친구입니다.

아마도 당신은 당신이 언급한 것과 같은 이름을 주지 않을 것입니다.upload.single('file').

저의 경우, 다른 뷰와 다른 라우터 파일에 두 가지 양식이 있었습니다.첫 번째 라우터는 뷰 1과 함께 이름 필드를 사용했으며 파일 이름은 "inputGroupFile02"였습니다.두 번째 보기에는 파일 입력에 대한 다른 이름이 있습니다.어떤 이유로 Multer는 다른 보기에서 다른 이름을 설정하는 것을 허용하지 않기 때문에 두 보기 모두에서 파일 입력에 동일한 이름을 사용하기로 결정했습니다.

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/31530200/node-multer-unexpected-field

반응형