有人可以帮我编写一个程序,从url下载图像文件并将其上传到AWS S3并删除下载的图像。
var download = function(uri, filename, callback){
request.head(uri, function(err, res, body){
console.log('content-type:', res.headers['content-type']);
console.log('content-length:', res.headers['content-length']);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
download('https://www.google.com/images/srpr/logo3w.png', 'google.png', function(){
console.log('done');
fs.readFile('google.png', function (err, data) {
if (err) {
console.log("Read file failed: "+ err)
}
let params = {
Bucket: waftBucket,
Key: 'google.png',
Body: data,
ContentType: 'image/png',
ACL: 'public-read'
};
let s3 = new AWS.S3();
s3.putObject(params, function(err, data) {
if (err) {
return console.log('There was an error uploading image: ' + err.message);
}
console.log('Successfully Uploaded.');
fs.unlink(google.png);
});
});
});
上面的代码适用于1个文件,但不适用于循环
var download = function(uri, filename, callback){
request.head(uri, function(err, res, body){
console.log('content-type:', res.headers['content-type']);
console.log('content-length:', res.headers['content-length']);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
var getFileName = function(url){
return url.split("/")[5];
}
var data = {
frags : [
{url: "https://fimgs.net/images/perfume/375x500.39678.jpg", fileName: getFileName("https://fimgs.net/images/perfume/375x500.39678.jpg")},
{url: "https://fimgs.net/images/perfume/375x500.4506.jpg", fileName: getFileName("https://fimgs.net/images/perfume/375x500.4506.jpg")},
{url: "https://fimgs.net/images/perfume/375x500.29601.jpg", fileName: getFileName("https://fimgs.net/images/perfume/375x500.29601.jpg")},
{url: "https://fimgs.net/images/perfume/375x500.32597.jpg", fileName: getFileName("https://fimgs.net/images/perfume/375x500.32597.jpg")}
]};
for(var i=0; i<data.frags.length; i++){
download(data.frags[i].url, data.frags[i].fileName, function(){
fs.readFile(data.frags[i].fileName, function (err, data) {
if (err) {
console.log("Read file failed: "+ err)
}
let params = {
Bucket: waftBucket,
Key: 'images/'+data.frags[i].fileName,
Body: data,
ContentType: 'image/jpeg',
ACL: 'public-read'
};
let s3 = new AWS.S3();
s3.putObject(params, function(err, data) {
if (err) {
return console.log('There was an error uploading image: ' + err.message);
}
console.log('Successfully Uploaded.');
fs.unlink(data.frags[i].fileName);
});
});
});
}
还有其他方法吗?是否可以读取URL的内容并将其直接保存到AWS S3存储桶,而无需下载和删除temp文件夹中的文件?
谢谢。
答案 0 :(得分:0)
在不了解确切用例的情况下,我建议您检出AWS CLI来执行此操作。它提供了一个sync选项,如下所述:
同步目录和S3前缀。递归复制新的和更新的 从源目录到目标的文件。仅创建 目标文件夹中是否包含一个或多个文件。
因此,您需要将文件下载到一个临时文件夹,使用CLI与S3同步,然后删除该文件夹(使用rimraf或fs)。
答案 1 :(得分:0)
s3.putObject
仅支持每个HTTP请求上传单个对象。
由于所有功能都是
async
,因此使用for循环会造成很多混乱。
因此,您可以使用promise来接一个地提出多个请求,也可以使用@kmukkamala指出的更好的解决方案。
在服务器上安装S3工具,然后运行以下命令来同步整个目录。
s3cmd sync myserverDir s3://bucket/
您可以安排corntab每10-20分钟运行一次脚本,然后删除该文件夹或文件。