2016-08-25 4 views
1

다중 파일을 업로드 한 다음 원래 이름으로 다시 이름을 바꾸기 위해 multer를 사용하려고했습니다. 샘플 코드는 다음과 같습니다.다중 파일 업로드 및 node.js의 multer로 이름 바꾸기

var express = require('express'); 
var app = express(); 
var fs = require("fs"); 

var multer = require('multer'); 

app.use(express.static('public')); 
var upload = multer({ dest: './upload/' }); 

app.get('/index.html', function (req, res) { 
    res.sendFile(__dirname + "/" + "index.html"); 
}) 

app.post('/file_upload', upload.array('theFile', 2), function (req, res, next) { 

    var errorcode = 0; 
    for (var i = 0; i < req.files.length; i++) { 
     fs.rename(req.files[i].path, req.files[i].destination + req.files[i].originalname, function (err) { 
      errorcode = err; 
     }(i)); 
    } 

    if (errorcode != 0) { 
     console.log("errorcode is " + errorcode); 
     res.sendStatus(500); 
     return; 
    } else { 
     res.json({ 
      message: 'File uploaded successfully', 
     }); 
    } 
}) 


var server = app.listen(8089, function() { 

    var host = server.address().address 
    var port = server.address().port 

    console.log("Example app listening at http://%s:%s", host, port) 

}) 

Windows 서버에서 위의 코드를 테스트하고 있습니다. 그리고 내 관찰 파일을 성공적으로 업로드 할 수 있지만 fs.rename() 오류 "1"반환 계속됩니다. 대상 폴더의 이름을 바꾼 파일은 항상 1KB입니다. 이름 바꾸기 기능이 여전히 업로드 할 수있는 파일을 가져 오는 것으로 보입니다. 나는 내 이해가 정확한지 확신하지 못한다. 그렇다면 파일이 완전히 업로드되었는지 확인하는 방법이 있습니까? 내 문제에 대한 제안?

답변

0

왜 Multer의 기본 이름 바꾸기 기능을 사용하지 않습니까? 와, 클라이언트는 모든 종류의 파일을 보낼 수 있습니다

  • :

    var storage = multer.diskStorage({ 
        destination: '/path/to/uploads/folder', 
        filename: function (req, file, cb) { 
        // Here we specify the file name to save it as 
        cb(null, file.originalname); 
        } 
    }) 
    
    // And we can use it for example like this: 
    app.post('/upload', upload.single('image'), function (req, res, next) { 
        // req.file is the `image` file 
        // req.body will hold the text fields, if there were any 
    }) 
    

    그러나,이 방법을 가지고가는 경우에 당신이 알아야 할 몇 가지가 있습니다 : 문서에서 적응

    임의의 (잠재적으로 부정확 한) 확장. 이는 잠재적 인 보안 위험입니다.

  • 두 파일이 같은 이름으로 업로드되면 두 번째 파일이 첫 번째 파일을 덮어 씁니다.
  • 이 파일을 다른 사용자에게 제공하면 보안 위험이 크게 높아집니다. 침입자는 스크립트 또는 HTML 페이지를 작성하여 업로드 할 수 있으며, 아마도 다른 파일 이름 확장자를 부여 할 수 있습니다. 이미지가 표시되지 않아 사용자가 새 탭에서 열려고하는 경우와 같이 여러 가지 방법으로 실행할 수 있습니다. 이것의 모든 함의와 그것을 다루는 방법은 그들 자신의 주제입니다.
  • 마지막으로, 사용자가 uploads 폴더가 아닌 다른 디렉토리에 쓸 수 없다는 것을 확인하십시오. file.originalname../../index.js과 같은 경우 어떻게됩니까? 파일 이름을 슬러그로 변환하는 것이 더 나을 수 있습니다.
+0

감사합니다. 방금 Multer의 기본 제공 기능을 시도했지만 예상대로 작동했습니다. BTW, 파일이 멀터에서 다운로드 완료되었는지 확인하는 방법이 있는지 알고 있습니까? – Liang

+0

@Liang'app.post' 라우트에 도달하면 완료되었습니다. https://github.com/expressjs/multer/issues/360#issuecomment-231001064 및 http://stackoverflow.com/a/30458411/3714913 – Nateowami

+0

을 참조하십시오. 위의 두 게시물에서 매우 명확하게 들립니다. 그러나, 나는 아직도 그것을 의심하고있다. "흥미롭게도 파일을 확장 한 시점에서 파일을 사용할 수없는 것 같습니다." – Liang

관련 문제