gpt4 book ai didi

javascript - 在 NodeJS 中从 URL 获取图像并通过 POST 上传到另一个

转载 作者:行者123 更新时间:2023-12-01 00:47:30 25 4
gpt4 key购买 nike

在下面的代码片段中,我使用 node-fetchform-data首先从远程 URL 检索图像文件,然后将其上传到 S3 存储桶(在不同的脚本中使用 aws-sdkmulter):

import fetch from 'node-fetch';
import fs from 'fs';
import FormData from 'form-data';

const form = new FormData();

const processProfileImg = (imageURL, userID) => {
fetch(imageURL, userID)
.then((response) => {
const dest = fs.createWriteStream(`./temp/${userID}.jpg`);
response.body.pipe(dest);
})
.then((dest) => {
form.append('profileImage', fs.createReadStream(`./temp/${userID}.jpg`));
fetch(`https://www.schandillia.com/upload/profile-image?userID=${userID}`, { method: 'POST', body: form })
.then(response => response.json())
.then(json => console.log(json));
});
};

export default processProfileImg;

问题是,这涉及一个中间步骤,即首先在检索时将文件存储在本地,然后再由 form-data 函数获取该文件进行 POST。有什么办法可以完全绕过这一步吗?我不想在本地保存文件,我只想从远程 URL 中提取它并将其 POST 到上传路由,而不创建本地文件。

更新:稍微修改代码片段以实现 Fransebas (第一个答案)的建议并避免异​​步问题后,我遇到了一个新问题:本地保存的图像没问题,但是上传到 S3 的副本被部分切断!

附加代码:处理 POST 上传的路由,https://www.schandillia.com/upload/profile-image ,如下,当我尝试使用 Postman 上传文件时效果很好。

import dotenv from 'dotenv';
import express from 'express';
import aws from 'aws-sdk';
import multerS3 from 'multer-s3';
import multer from 'multer';
import path from 'path';

dotenv.config();
const router = express.Router();

// Set up S3
const s3 = new aws.S3({
accessKeyId: process.env.IAM_ACCESS_KEY_ID,
secretAccessKey: process.env.IAM_SECRET_ACCESS_KEY,
});

const checkFileType = (file, cb) => {
// Allowed ext
const filetypes = /jpeg|jpg/;
// Check ext
const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
// Check mime
const mimetype = filetypes.test(file.mimetype);
if (mimetype && extname) {
return cb(null, true);
}
return cb('Error: JPEG Only!');
};

// Single Upload
const profileImgUpload = multer({
storage: multerS3({
s3,
contentType: multerS3.AUTO_CONTENT_TYPE,
bucket: `${process.env.S3_BUCKET_NAME}/w`,
acl: 'public-read',
key(req, file, cb) {
cb(null, req.query.userID + path.extname(file.originalname));
},
}),
limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
fileFilter(req, file, cb) {
checkFileType(file, cb);
},
}).single('profileImage');

router.post('/profile-image', (req, res) => {
profileImgUpload(req, res, (error) => {
if (error) {
console.log('errors', error);
res.json({ error });
} else if (req.file === undefined) {
// If File not found
console.log('Error: No File Selected!');
res.json('Error: No File Selected');
} else {
// If Success
const imageName = req.file.key;
const imageLocation = req.file.location;
// Save the file name into database into profile model
res.json({
image: imageName,
location: imageLocation,
});
}
});
});
// End of single profile upload

// We export the router so that the server.js file can pick it up
module.exports = router;

最佳答案

我没有使用那种特定的发送数据的方式(我更喜欢ajax),但是通过查看你的示例,我想你可以跳过在本地保存图像。如果您看到 fs.createReadStream 创建一个读取流。寻找从您获得的内容中创建读取流的方法。

此外,我认为您应该将发送代码放在 then 中,这样就不会出现异步问题。例如,如果您用于发送数据的代码位于 then 内,那么您可以使用 response.body 来创建流。

你几乎得到了它,但你仍在使用该文件,我认为你可以用更像这样的东西归档它

import fetch from 'node-fetch';
import fs from 'fs';
import FormData from 'form-data';

const form = new FormData();

const processProfileImg = (imageURL, userID) => {
fetch(imageURL, userID)
.then((response) => {
// Use response.body directly, it contains the image right?
form.append('profileImage', response.body);
fetch(`https://www.schandillia.com/upload/profile-image?userID=${userID}`, { method: 'POST', body: form })
.then(response => response.json())
.then(json => console.log(json));
});
};

export default processProfileImg;

如果我正确理解fetch的文档,response.body已经是一个流。

关于javascript - 在 NodeJS 中从 URL 获取图像并通过 POST 上传到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57258847/

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