gpt4 book ai didi

node.js - 如何将 multer 保存在内存中的文件上传到另一个 API

转载 作者:搜寻专家 更新时间:2023-10-31 22:32:01 26 4
gpt4 key购买 nike

我有 2 个独立的 NodeJS API 使用 multer将文件保存在内存中。

我的 express 中间件是这样的

import multer from 'multer';
const storage = multer.memoryStorage();

export default multer({ storage }).single('image');

我能够成功接收保存在内存中的文件,所以我的req.file.image 看起来像这样

{ 
fieldname: 'image',
originalname: 'image-2017-08-28-13-47-31-218.png',
encoding: '7bit', mimetype: 'image/png',
buffer: <Buffer 89 50 4e 47 0d 0a 1a 0 ... >,
size: 493181
}

收到文件后,在第一个 API 上,我需要将它发送到同样使用multer第二个API> express

function secondApiReceiveImage(req, res) {
console.log(req.file)
console.log(req.files)
console.log(req.body)
res.send('ok');
}

我尝试使用以下实现发送

通过https://github.com/request/request#multipartform-data-multipart-form-uploads

import request from 'request';

function firstApiReceiveImage(req, res) {
const options = {
url:'http://SECOND_API/api/image',
formData: { image: req.file.buffer }
};
request.post(options, (err, httpResponse, body) => {
console.log('err', err);
console.log('body', body);
});
}

在这种情况下,req.filereq.filesreq.body 的日志都是未定义的 secondApiReceiveImage API 处理函数

我的下一次尝试是使用 https://github.com/form-data/form-data

import multer from 'multer';
const storage = multer.memoryStorage();

export default multer({ storage }).single('image');

function firstApiReceiveImage(req, res) {
const CRLF = '\r\n';
const form = new FormData();
const opts = {
header: `${CRLF} + '--' + ${form.getBoundary()} + ${CRLF} + 'X-Custom-Header: 123' + ${CRLF} + ${CRLF}`,
knownLength: 1
};

form.append('image', req.file.image.buffer, opts);
form.submit('http://SECOND_API/api/image', (err, res) => {
console.log('err', err);
console.log('res', res);
});
}

我得到了相同的结果,undefined for req.file, req.files & req.body在第二个 API 上

除了 multer 顺便说一句,这些是我的两个 API 的中间件

app.use(compression());
app.use(helmet());
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

如果我可以在第一个 API 上持久化文件,我的生活可能会更轻松,但在这种情况下我们不允许保存到磁盘 :(

对我有什么建议吗?

最佳答案

我偶然发现了同样的问题,这是我设法想出的。

首先,我使用 form-data 包来模拟服务器端的 FormData 数据结构,这里是执行此操作的 util 文件。

    const FormData = require('form-data')
const formData = new FormData()
const config = {
headers: {
'Content-Type': `multipart/form-data; boundary=${formData.getBoundary()}`
}
}
export default { data: formData, config }

这是我的 node.js api 文件


import formSet from '../utils/formData'

const multer = require('multer')
const upload = multer()

const { Router } = require('express')
const router = Router()

......

router.post('/api/images', upload.single('image'), async (req, res) => {
formSet.data.append('image', req.file.buffer, { filename: req.file.originalname })
formSet.data.append('other_data', 'value')
const response = await axios.post('/images', formSet.data, formSet.config)

.......

})

关于node.js - 如何将 multer 保存在内存中的文件上传到另一个 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46975590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com