0

我正在尝试使用 express 上传图像,但我面临两个问题,首先,每当我再次上传相同的图像时,它不会被上传;其次,在上传任何单个图像后,一个带有图像的文件也会上传。这是我的代码。

var multer = require('multer');
var uploads = multer({dest: './images'});
app.post('/uploading', uploads.single("file"), function (req, res) {

   var file = __dirname +"/images" + "/" + req.file.originalname;

   fs.readFile( req.file.path, function (err, data) { 
        fs.writeFile(file, data, function (err,data) {
         if( err ){
              console.error( err );
              response = {
                   message: 'Sorry, file couldn\'t be uploaded.',
                   filename: req.file.originalname
              };
         }else{
               response = {
                   message: 'File uploaded successfully',
                   filename: req.file.originalname
              };
          }
          res.end( JSON.stringify( response ) );
       });
   });
})
4

2 回答 2

0

uploads.single("file")中间件将处理文件上传。您不必专门fs.readfs.write文件。

var multer = require('multer');
var uploads = multer({dest: './images'});
app.post('/uploading', uploads.single("file"), function (req, res) {

   //the file is uploaded automatically

})

编辑:上面的代码将以十六进制字符串作为文件名上传文件,没有任何扩展名。

为了添加重命名功能,您需要使用diskStorage. 这是取自此 github 问题页面的代码。

var multer = require('multer');
var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './images/')
  },
  filename: function (req, file, cb) {
    crypto.pseudoRandomBytes(16, function (err, raw) {
      cb(null, raw.toString('hex') + Date.now() + '.' + mime.extension(file.mimetype)); //this is the rename func
    });
  }
});

var uploads = multer({ storage: storage });
app.post('/uploading', uploads.single("file"), function (req, res) {

   //the file is uploaded automatically

})

现在您可以将uploads变量用作中间件,如上面的代码片段所示。

您可以filename: function (req, file, cb) { .. }根据需要进行编辑。现在文件名将是<16characterhexstring>.ext

于 2018-08-02T10:41:50.860 回答
0

另一种处理它的方法是不使用中间件,而是通过以下选项手动使用 multer:

 try {
        var storage = multer.diskStorage({
            destination: function(request, file, callback) {

               //define folder here by fs.mkdirSync(anyDirName);

            },
            filename: function(req, file, callback) {

                callback(null, anyFileName);
            },
            limits: self.limits
        });

        var upload = multer({
            storage: storage,
            fileFilter: function(request, file, callback) {
                // here you can filter out what not to upload..
               } 
        }).any();

        upload(request, response, callback);
    } catch (e) {

    }

希望这可以帮助!

于 2018-08-02T11:05:18.323 回答