简体   繁体   English

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

[英]How to upload files to S3 bucket from url directly

I am getting some MMS messages from my users.我从我的用户那里收到了一些彩信。 Those MMS are coming via twilio.这些彩信来自 twilio。 So twilio storing those files into their server and I can visit those files from twilio.所以 twilio 将这些文件存储到他们的服务器中,我可以从 twilio 访问这些文件。 But in my case, I need to store those files into S3 and show into our system from S3.但就我而言,我需要将这些文件存储到 S3 并从 S3 显示到我们的系统中。 I can store those files into my local folder or my server.我可以将这些文件存储到我的本地文件夹或服务器中。 But I am not finding any way to store file into the S3 directly from the url.但我没有找到任何方法将文件直接从 url 存储到 S3 中。 This is what I have done to store into the local directory from url.这是我从 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));

And this is how I am saving my files into S3 if anyone want to upload it directly into my system.如果有人想将文件直接上传到我的系统中,这就是我将文件保存到 S3 的方式。 For example if any user want to upload their profile picture.例如,如果任何用户想要上传他们的个人资料图片。

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;
    }
}

Those above codes are working fine.以上代码工作正常。 But I am not finding any way to store into S3 from url.但我没有找到从 url 存储到 S3 的任何方法。 Please note I am writing code in CakePHP.请注意我在 CakePHP 中编写代码。

Have a look at the Twilio Function below, it should point you in the right direction.看看下面的Twilio Function ,它应该为您指明正确的方向。

It was derived from this Twilio Blog:它源自此 Twilio 博客:

Encrypting and Storing Twilio Flex Recordings Off-site 异地加密和存储 Twilio Flex 录音

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)
    })
  }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM