javascript - 以 Express 方式发送上传的图像

标签 javascript node.js express multer

拥有一个使用 Multer 上传图像的 Express 应用程序。我希望能够做的就是服务于这个形象。但面临的挑战是,当文件上传时,它不会保存文件扩展名,该扩展名是根据我出于安全目的而阅读的内容设计的。我需要做的就是向相应的 mime 类型添加正确的扩展名。

技术

  • express :4.15.0
  • 穆特:1.3.0
  • mmmagic:0.4.5

文件结构

root
  server.js
  /uploads
    /images
      ad58c400e67362118ac1b11f6c4b6c44
      ...
  /routes
    drinks.routes.js
    uploads.routes.js

通过 Postman 运行这一切。有表单元素nametaglineimage。如果我上传“IMG_111.jpg”,该图像将通过 Multer 上传,验证它是图像类型,并使用新名称放置在 /images/uploads 中,这是 Multer 创建唯一性的默认行为。问题是我有文件名,但它没有以扩展名保存。

drinks.routes.js

var upload = multer({
  dest: 'uploads/images',
  fileFilter: function (req, file, callback) {
    console.log('running upload file filter');
      var fileType = file.mimetype;
      if(fileType !== 'image/png' && fileType !== 'image/jpeg' && fileType !== 'image/gif' && fileType !== 'image/jpg') {
          return callback(new Error('Only images are allowed'))
      }
      callback(null, true)
  },
}).single('image');

router.route('/').post(passport.authenticate('jwt', { session: false }), upload, function(req, res, next){
var drink = req.body;
var drinkImage = req.file;
console.log('DRINK IMAGE', drinkImage);

Drink.createDrink(drink, drinkImage, function(err, drink, drinkImage){
  console.log('creating drink');
  if(err){
    res.send(err);
  }
    res.json(drink)
  });
});

因此我可以上传文件、验证文件、使用唯一名称且不带扩展名保存文件。我遇到困难的地方是检查所请求图像的 mime 类型,附加扩展名并将其发送回响应中。

我最初的想法是创建一个具有请求的图像名称的路由,使用 mmmagic 检测 mime 类型,添加扩展名并提供该文件。但是,所有尝试都失败了。

uploads.routes.js

var express = require('express');
var router = express.Router();
var path = require('path');

var mmm = require('mmmagic');
var Magic = mmm.Magic;
var magic = new Magic(mmm.MAGIC_MIME_TYPE);

router.use(function(req, res, next){
  next();
});

router.route('/images/:filename')
  .get(function(req,res){
    var fileName = req.params.filename;
    var constructFile = function(res){
      magic.detectFile(__dirname + '/../uploads/images/' + fileName, function(err, result) {
        if (err) throw err;
        console.log(result);
        if (result == 'image/jpeg'){
      // return res.sendFile(__dirname + '/../uploads/images/' + fileName + '.jpg');
      res.send(express.static(path.join(__dirname, '/../uploads/images'), {index: false, extensions:['jpg']}));
    }
  });
}

constructFile(res);
  })


module.exports = router;

尝试按照此SO这引导我到express.static。但目前无法弄清楚我是否走在正确的轨道上并且只是错过了一些东西,或者我是否应该从不同的 Angular 来看待这个问题。

最佳答案

您必须首先配置您的 multer uploader 。试试这个:

var multer = require('multer');
//This is for preventing multer from giving name without extention
var storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, 'public/files/')
},
filename: function(req, file, cb) {
    cb(null, file.originalname);
}
});

但是,如果您仍然想拥有唯一的名称,请尝试以下操作:

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'public/files/')
  },
  filename: function (req, file, cb) {
    crypto.pseudoRandomBytes(16, function (err, raw) {
      cb(null, raw.toString('hex') + Date.now() + '.' + 
         mime.extension(file.mimetype));
    });
  }
});
var upload = multer({ storage: storage });

关于javascript - 以 Express 方式发送上传的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44382316/

相关文章:

javascript - 如何判断复制的内容是来自word文档还是浏览器网页?

javascript - JQuery - 在一个函数中访问一个 VAR,而我将在另一个函数中需要它?

node.js - 为什么发射在套接字内不起作用

javascript - 无法 "skip" Mongoose 子文档

javascript - 如何有效地填充 MongoDB 数据库以进行 e2e 测试

node.js - 如何使用 Node 编译器,得到 "ERROR: trying to use package.json variables, but not setup to do so"

javascript - 如何避免Promise链中出现 'headers already sent'?

javascript - 将对象保存在模块中并从不同的模块访问它

javascript - 检测 chrome 是否正在加载缓存页面?

javascript - 尝试在 javascript 中将 div block 宽度更改为屏幕宽度以使其响应