使用body-parser和Express从请求读取png图像

时间:2018-11-21 16:25:50

标签: node.js express post binary body-parser

我正在使用邮递员向服务器发送以下请求:

enter image description here

我尝试使用以下代码访问应用程序中的图像:

app.js

var express = require('express');
var bodyParser = require('body-parser');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

app.use(bodyParser.raw({
  type: 'image/png',
  limit: '10mb'
}));

app.use('/', indexRouter);
app.use('/users', usersRouter);

module.exports = app;

index.js(路由器)

var express = require('express');
const router = express.Router();
var Jimp = require('jimp');

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});

router.post('/a', function(req, res) {
  var image = req.body;

  try{
      Jimp.read(image, (err, input) => {
        if (err) throw err;
        input.sepia();

        input.getBuffer(Jimp.AUTO, (err, output) => {
          if(err) throw err;

          res.writeHead(200, {'Content-Type': 'image/png' });
          return res.end(output, 'binary');
        });
      });
  }catch (err){
      return res.status(400).send(`Error: ${err.message}`).end();
  }
});

module.exports = router;

我首先使用表单(在express-fileupload库的帮助下)发送图像,并且效果很好,所以我知道问题必须出在var image = req.body行之前。 为了使Jimp函数(图像处理库)正常工作,图像必须是表示png图像的缓冲区。 运行console.log(image)时,控制台将输出{}

有人可以向我展示一种以二进制文件形式发送png作为缓冲区的方法吗?

2 个答案:

答案 0 :(得分:0)

没关系,我只需要将请求中的Content-Type标头更改为image / png -.-

答案 1 :(得分:0)

可以用lib multer重写功能吗?

const multer  = require('multer')
const storage = multer.memoryStorage()
const upload = multer({ storage: storage })

router.post('/a', upload.single('image'), function(req, res, next) {    
  const image = req.file.buffer    
});

还是强大?

var formidable = require('formidable' );

router.post('/a', (req, res) => {
  const form = new formidable.IncomingForm();
  form.parse(req, (error, fields, files) => {
    const image = files.image;
  })
});