Express 4.0으로 파일 업로드 : req.files undefined


239

나는 익스프레스 4.0 간단한 파일 업로드 메커니즘 작업을 진행하려고 해요하지만 난 점점 계속 undefined에 대한 req.filesapp.post몸. 관련 코드는 다음과 같습니다.

var bodyParser = require('body-parser');
var methodOverride = require('method-override');
//...
app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true })); 
app.use(methodOverride()); 
//...
app.post('/fileupload', function (req, res) {
  console.log(req.files); 
  res.send('ok'); 
}); 

.. 및 해당 퍼그 코드 :

form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
    input(type="file", name="file", id="file")
    input(type="submit", value="Upload")

솔루션 아래 mscdex
의 응답 덕분에 대신 다음 을 사용으로 전환했습니다 .busboybodyParser

var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy()); 
//...
app.post('/fileupload', function(req, res) {
    var fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log("Uploading: " + filename); 
        fstream = fs.createWriteStream(__dirname + '/files/' + filename);
        file.pipe(fstream);
        fstream.on('close', function () {
            res.redirect('back');
        });
    });
});

1
여러 파일에서 어떻게 작동합니까?
chovy

@chovy 여러 파일로 잘 작동합니다
mscdex

2
app.post ( '/ fileupload', busboy (), function (req, res) {
Shimon Doodkin

좋은 해결책 방금 ./files/앱의 홈 디렉토리에 디렉토리 를 만들어야한다는 것을 알고 싶었습니다. 그렇지 않으면 업로드 후 오류가 발생합니다.
소스

임시 파일은 어떻게 처리됩니까? 버스 보이는 자동으로 삭제합니까? 디스크에 저장하기 전에 임시 파일이 삭제되는 곳이 없습니다.
ed-ta

답변:


210

body-parser모듈은 multipart가 아닌 JSON 및 urlencoded 양식 제출 만 처리합니다 (파일을 업로드하는 경우에 해당).

다중를 들어, 사용과 같은 것을 필요할 것 connect-busboy또는 multerconnect-multiparty(다자간가 / 강력한 원래 명시 bodyParser 미들웨어에 사용 된 것입니다). 또한 FWIW, 나는이라는 버스 보이의 최상위 계층에서 작업하고 reformed있습니다. Express 미들웨어와 함께 제공되며 별도로 사용할 수도 있습니다.


4
고마워요. 비록 connect-busboy그냥 대신 사용해야 했습니다 busboy. 솔루션으로 원래 게시물을 업데이트했습니다.
safwanc

4
고마워 친구! 나는 connect-multiparty이것들 중에서 가장 좋은 옵션을 찾습니다 !
neciu

reformed아직 개발 중? github에 대한 마지막 커밋은 2014 년입니다 ... 여러분의 의견으로는 멀티 파트 폼 데이터를 처리하는 가장 좋은 모듈은 무엇입니까? "최고"란 최고의 지원과 더 나은 기능 (보다 적은 버그), 더 많은 기능과 더 긴 미래를 의미 multer합니다. 최고의 지원으로 보였지만 여전히 더 지원해야한다고 생각합니다.
nbro

[편집 : 괜찮습니다. 아래 답변을 보았습니다.] express 3.0에서 multipart를 사용하여 4.0에서 중단 되었습니까? 이 튜토리얼은 3.4.8을 사용하고 추가 미들웨어없이 파일을 업로드 할 수 있기 때문에 묻습니다. blog.robertonodi.me/simple-image-upload-with-express
thetrystero

@thetrystero 연결 한 특정 예제에 대한 github 저장소는 실제로 저장소에 종속성이 체크인되어 있습니다. 이러한 종속성을 살펴보면 Express 3.x와 함께 Connect 2.x (여러 개의 멀티 파트 모듈이 번들로 제공됨)가 포함되어 있음을 알 수 있습니다. 이것이 바로 멀티 파트 핸들링이 "즉시"작동하는 이유입니다.
mscdex

31

내가 찾은 인터넷 검색 결과는 다음과 같습니다.

var fileupload = require("express-fileupload");
app.use(fileupload());

업로드를위한 매우 간단한 메커니즘입니다.

app.post("/upload", function(req, res)
{
    var file;

    if(!req.files)
    {
        res.send("File was not found");
        return;
    }

    file = req.files.FormFieldName;  // here is the field name of the form

    res.send("File Uploaded");


});

대용량 파일의 경우 너무 느림
Eduardo

3
사용하지 않았 fileupload습니까?
BrandonFlynn-NB 2016

5
위의 답변이 효과가 app.js const fileUpload = require('express-fileupload') app.use(fileUpload())
있으

11

그것은처럼 보이는 body-parser 익스프레스 3에서 지원 업로드 파일을하지만,이 경우 지원 익스프레스 4 감소되지 않았다 더 이상 종속성으로 연결을 포함

mscdex의 답변에서 일부 모듈을 살펴본 결과 express-busboy훨씬 더 나은 대안이며 드롭 인 대체품에 가장 가까운 것으로 나타났습니다 . 내가 발견 한 유일한 차이점은 업로드 된 파일의 속성에 있습니다.

console.log(req.files)사용 체내 파서 (특급 3)의 출력과 같이 보인다고 개체 :

{ file: 
   { fieldName: 'file',
     originalFilename: '360px-Cute_Monkey_cropped.jpg',
     name: '360px-Cute_Monkey_cropped.jpg'
     path: 'uploads/6323-16v7rc.jpg',
     type: 'image/jpeg',
     headers: 
      { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"',
        'content-type': 'image/jpeg' },
     ws: 
      WriteStream { /* ... */ },
     size: 48614 } }

고속 버스 보이console.log(req.files)사용 하는 것과 비교 (Express 4) :

{ file: 
   { field: 'file',
     filename: '360px-Cute_Monkey_cropped.jpg',
     file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg',
     mimetype: 'image/jpeg',
     encoding: '7bit',
     truncated: false
     uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } }

8

1) 파일이 클라이언트 쪽에서 실제로 전송되었는지 확인하십시오. 예를 들어, 당신은 크롬 콘솔에서 확인할 수 있습니다 : 스크린 샷

2) NodeJS 백엔드의 기본 예는 다음과 같습니다.

const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();

app.use(fileUpload()); // Don't forget this line!

app.post('/upload', function(req, res) {
   console.log(req.files);
   res.send('UPLOADED!!!');
});

7

멀터 는 "multipart / form-data"를 처리하고 마술처럼 & 업로드 된 파일 및 양식 데이터를 request.files 및 request.body로 요청하여 우리에게 제공하는 미들웨어입니다.

멀터 설치 :- npm install multer --save

.html 파일에서 :-

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="hidden" name="msgtype" value="2"/>
    <input type="file" name="avatar" />
    <input type="submit" value="Upload" />
</form>

.js 파일에서 :-

var express = require('express');
var multer = require('multer');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var upload = multer({ dest: 'uploads/' });

app.use(function (req, res, next) {
  console.log(req.files); // JSON Object
  next();
});

server.listen(port, function () {
  console.log('Server successfully running at:-', port);
});

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/file-upload.html');
})

app.post('/upload', upload.single('avatar'),  function(req, res) {
  console.log(req.files); // JSON Object
});

도움이 되었기를 바랍니다!



0

문제 해결됨 !!!!!!!

아웃 턴 storage기능은 한 번도 실행하지 않았다. 내가 app.use(upload)같이 포함해야했기 때문에upload = multer({storage}).single('file');

 let storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './storage')
          },
          filename: function (req, file, cb) {
            console.log(file) // this didn't print anything out so i assumed it was never excuted
            cb(null, file.fieldname + '-' + Date.now())
          }
    });

    const upload = multer({storage}).single('file');

-1

express-fileupload 요즘 여전히 작동하는 유일한 미들웨어처럼 보입니다.

동일 예의 경우, multerconnect-multiparty의 부정 값 제공 req.file 또는 req.files을 하지만express-fileupload 작품.

그리고 req.file / req.files 의 빈 값에 대해 제기 된 많은 질문과 문제가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.