天天看点

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