首页 > 解决方案 > 通过 POST 请求使用 NodeJS/ExpressJS 处理二进制图像或文件

问题描述

我想知道是否有办法处理只包含一个文件的 POST 请求,没有表单,只是一个作为请求正文发送的二进制文件。

const path = require('path');
const express = require('express');
const app = express();
const logger = require('morgan');

// Settings
app.set('port', process.env.PORT || 3000)

// Middlewares
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({extended: true}));

app.post('/upload', (req, res) => {
    console.log(req.headers);
    
    let data = ''
    
    req.on('data', chunk => {
        data += chunk;
    })

    req.on('end', () => {
        fs.writeFileSync('img.jpg', data)
    })
    
    res.send('ok');
})

app.listen(app.get('port'), console.log(`Listening on any ${app.get('port')}`));

我已尝试提出此请求:(对不起,外部链接,我刚刚创建了帐户)

POSTMAN,使用二进制选项

标题:

{
  'user-agent': 'PostmanRuntime/7.26.5',
  accept: '*/*',
  'postman-token': 'aca04fab-a66d-439a-962f-87ede2b8bb98', 
  host: 'localhost:3000',
  connection: 'keep-alive',
  'content-length': '73989'
}

并且不工作,img.jpg只是腐败。

更新:(感谢eol的帮助)

这就是代码现在的工作方式,带有express.raw内置的中间件:

app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(express.raw({type: '*/*'}));

app.post('/upload', (req, res) => {
    fs.writeFileSync('img.jpg', req.body);
    res.send('ok');
})

标签: node.jsexpress

解决方案


据我所知,内置的bodyparser应该能够开箱即用。尝试设置它:

app.use(express.raw({type: 'application/octet-stream'}))

然后在您的处理程序内部req.body应该保存内容的缓冲区:

app.post('/upload', (req, res) => {
  // req.body should hold the bindary-data as a buffer
});

推荐阅读