繁体   English   中英

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

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

我从我的用户那里收到了一些彩信。 这些彩信来自 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 博客:

异地加密和存储 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