微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何直接从 url 上传文件到 S3 存储桶

如何解决如何直接从 url 上传文件到 S3 存储桶

我收到了一些来自用户的彩信。这些彩信来自 twilio。所以 twilio 将这些文件存储到他们的服务器中,我可以从 twilio 访问这些文件。但就我而言,我需要将这些文件存储到 S3 中并从 S3 显示到我们的系统中。我可以将这些文件存储到我的本地文件夹或我的服务器中。但是我没有找到直接从 url 将文件存储到 S3 的任何方法。 这是我从 url 存储到本地目录所做的工作。

// url of my file. Mostly it will be image.
$url = 'urlofmyfile';
// Path where I am saving. Keeping for jpg for Now
$img = 'file/sms/file.jpg';
// saving the file into the folder
file_put_contents($img,file_get_contents($url));

如果有人想将文件直接上传到我的系统,这就是我将文件保存到 S3 的方式。例如,如果任何用户想要上传他们的个人资料图片

public function savetoS3Bucket($uploadFileName,$imageTmpName) {
    $s3Client = new \Aws\S3\S3Client([
        'version' => env('S3_BUCKET_VERSION'),'region'  => env('S3_BUCKET_REGION'),'credentials' => array(
            'key'    => env('S3_BUCKET_KEY'),'secret' => env('S3_BUCKET_SECRET'),)
    ]);
    try {
        $s3Client->putObject([
            'Bucket' => env('S3_BUCKET_NAME'),'Key'    => $uploadFileName,'SourceFile' => $imageTmpName,'StorageClass' => 'REDUCED_REDUNDANCY','ACL' => 'public-read'
        ]);
        return true;
    } catch (S3Exception $e) {
        echo $e->getMessage() . PHP_EOL;
        return false;
    }
}

以上代码运行良好。但是我没有找到任何从 url 存储到 S3 的方法。请注意,我正在使用 CakePHP 编写代码

解决方法

看看下面的 Twilio Function,它应该为您指明了正确的方向。

它源自这个 Twilio 博客:

Encrypting and Storing Twilio Flex Recordings Off-site

const axios = require('axios');
let AWS = require('aws-sdk');
const S3UploadStream = require('s3-upload-stream');

exports.handler = async function(context,event,callback) {

// Set the region
AWS.config.update({region: 'us-west-2'});
AWS.config.update({ accessKeyId: context.AWSaccessKeyId,secretAccessKey: context.AWSsecretAccessKey });

// The name of the bucket that you have created
const BUCKET_NAME = 'winston';

const fileUrl = "https://a.b.twil.io/assets/KittehWinston.jpg";
const fileName = "winston.jpg";

const s3Stream = S3UploadStream(new AWS.S3());

// call S3 to retrieve upload file to specified bucket
let upload = s3Stream.upload({Bucket: BUCKET_NAME,Key: fileName,ContentType: 'image/jpeg',ACL: 'public-read'   });

const fileUpload = await uploadFile(fileUrl,upload)
.then(result => callback(null,`success: ${JSON.stringify(result)}`))
.catch(err => callback(err.message));

async function uploadFile (url,upload) {

    const response = await axios({
      url,method: 'GET',responseType: 'stream'
    })
  
    response.data.pipe(upload);
  
    return new Promise((resolve,reject) => {
      upload.on('uploaded',resolve)
      upload.on('error',reject)
    })
  }
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。