NodeJS 从url上传图像到s3

sauutmhj  于 2023-01-30  发布在  Node.js
关注(0)|答案(3)|浏览(147)

我正在尝试上传一个图像,我有一个到s3的url
我想执行相同操作,但不将映像下载到本地存储

filePath = imageURL;
          let params = {
            Bucket: 'bucketname',
            Body: fs.createReadStream(filePath),
            Key: "folder/" + id + "originalImage"
          };
          s3.upload(params, function (err, data) {
            if (err) console.log(err);
            if (data) console.log("original image success");
          });

期望成功但得到错误:myURL是https可公开访问的URL。

[Error: ENOENT: no such file or directory, open '<myURL HERE>']
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path:
   '<myURL HERE>' }
xfb7svmp

xfb7svmp1#

有两种方法可以将文件放入Amazon S3存储桶:

*通过PutObject() * 或上传**内容
*复制Amazon S3中已有的对象

因此,对于“可通过网络访问的Cloudinary映像”,需要先检索,然后再上传。您可以完全下载映像,然后再上传,也可以使用流媒体来做一些花哨的事情,将源映像读入缓冲区,然后写入S3。无论哪种方式,都需要从Cloudinary“读取”文件,然后“写入”S3。
至于“Web可访问的Amazon S3链接”,您可以使用CopyObject()命令来指示S3直接将对象从源存储桶复制到目的存储桶(它也可以在存储桶内工作)。

pieyvz9o

pieyvz9o2#

这将向图像URL发出GET请求,并将响应直接通过管道传输到S3上载流,而无需将图像保存到本地文件系统。

const request = require('request');
const fs = require('fs');

const imageURL = 'https://example.com/image.jpg';
const s3 = new AWS.S3();

const params = {
    Bucket: 'bucketname',
    Key: "folder/" + id + "originalImage"
};

const readStream = request(imageURL);
const uploadStream = s3.upload(params).createReadStream();

readStream.pipe(uploadStream);
zwghvu4y

zwghvu4y3#

您可以使用以下代码段,通过文件URL在S3中上传文件。

import axios from 'axios';
import awsSDK from 'aws-sdk';

const uploadImageToS3 = () => {
  const url = 'www.abc.com/img.jpg';
  axios({
    method: 'get',
    url: url,
    responseType: 'arraybuffer',
  })
 .then(function (response) {
   console.log('res', response.data);
   const arrayBuffer = response.data;
   if (arrayBuffer) {
     awsSDK.config.update({
       accessKeyId: 'aws_access_key_id',
       secretAccessKey: 'aws_secret_access_key',
       region: 'aws_region',
     });

    const s3Bucket = new awsSDK.S3({
      apiVersion: '2006-03-01',
      params: {
        Bucket: 'aws_bucket_name'
      }
    });

    const data = {
      Body: arrayBuffer,
      Key: 'unique_key.fileExtension',
      ACL: 'public-read'
    };

    const upload = s3Bucket.upload(data, (err, res) => {
      if (err) {
        console.log('s3 err:', err)
      }
      if (res) {
        console.log('s3 res:', res)
      }
    })
  }
});
}

uploadImageToS3();

相关问题