天天看點

php aws s3上傳圖檔body,amazon-web-services – 如何在PHP上将上傳的圖像存儲到AWS S3

盡管“S3fs在最近的建構中非常可靠”,我可以分享自己的s3fs和info的經驗,我們在定期随機系統崩潰之後将寫操作從直接的s3fs挂載檔案夾通路到aws控制台(也可能是SDK api).

你可能不會對像圖像這樣的小尺寸檔案有任何問題,但是當我們嘗試編寫mp4檔案時它肯定會出現問題.系統崩潰之前的日志中的最後一條消息是:

kernel: [ 9180.212990] s3fs[29994]: segfault at 0 ip 000000000042b503 sp 00007f09b4abf530 error 4 in s3fs[400000+52000]

并且它是罕見的随機情況,但這使系統不穩定.

是以我們決定仍然保持s3fs安裝,但僅将其用于讀取通路

下面我将展示如何在沒有密碼檔案的情況下使用AIM憑據挂載s3fs

#!/bin/bash -x

S3_MOUNT_DIR=/media/s3

CACHE_DIR=/var/cache/s3cache

wget http://s3fs.googlecode.com/files/s3fs-1.74.tar.gz

tar xvfz s3fs-1.74.tar.gz

cd s3fs-1.74

./configure

make

make install

mkdir $S3_MOUNT_DIR

mkdir $CACHE_DIR

chmod 0755 $S3_MOUNT_DIR

chmod 0755 $CACHE_DIR

export IAMROLE=`curl http://169.254.169.254/latest/meta-data/iam/security-credentials/`

/usr/local/bin/s3fs $S3_BUCKET $S3_MOUNT_DIR -o iam_role=$IAMROLE,rw,allow_other,use_cache=$CACHE_DIR,uid=222,gid=500

此外,您還需要建立配置設定給具有附加政策的執行個體的IAM角色:

{"Statement":[{"Resource":"*","Action":["s3:*"],"Sid":"S3","Effect":"Allow"}],"Version":"2012-10-17"}

在你的情況下,似乎使用php sdk是合理的(其他答案已經有用法示例),但你也可以使用aws控制台将圖像寫入s3:

aws s3 cp /path_to_image/image.jpg s3://your_bucket/path

如果您将建立IAM角色并将其配置設定給您的執行個體,則無需提供任何其他憑據

更新 – 回答您的問題:

>我不需要包含工廠方法來聲明我的IAM憑證?

是,如果您将IAM配置設定給ec2執行個體,那麼在代碼中您隻需建立用戶端:

$s3Client = S3Client::factory();

$bucket = 'my_s3_bucket';

$keyname = $_POST['cat'].'/original_'‌​.uniqid('fu_').'.jpg';

$localFilePath = '/local_path/some_image.jpg';

$result = $s3Client->putObject(array(

'Bucket' => $bucket,

'Key' => $keyname,

'SourceFile' => $filePath,

'ACL' => 'public-read',

'ContentType' => 'image/jpeg'

));

unlink($localFilePath);

選項2:如果您不需要檔案本地存儲階段,但會從上傳表單中放置direclt:

$s3Client = S3Client::factory();

$bucket = 'my_s3_bucket';

$keyname = $_POST['cat'].'/original_'‌​.uniqid('fu_').'.jpg';

$dataFromFile = file_get_contents($_FILES['uploadedfile']['tmp_name']);

$result = $s3Client->putObject(array(

'Bucket' => $bucket,

'Key' => $keyname,

'Body' => $dataFromFile,

'ACL' => 'public-read',

));

如果你有公共通路權限,可以獲得s3連結

$publicUrl = $s3Client->getObjectUrl($bucket, $keyname);

或者為私人内容生成簽名網址:

$validTime = '+10 minutes';

$signedUrl = $s3Client->getObjectUrl($bucket, $keyname, $validTime);