gpt4 book ai didi

amazon-web-services - 我如何在 PHP 上将上传的图像存储到 AWS S3

转载 作者:行者123 更新时间:2023-12-04 08:15:34 24 4
gpt4 key购买 nike

我在 EC2 实例上,我希望将我的 PHP 网站与我的 Amazon S3 存储桶连接起来,我已经在这里看到了 PHP 的 API:http://aws.amazon.com/sdkforphp/但目前还不清楚。

这是我需要在 Controller 中编辑的代码行:

thisFu['original_img']='/uploads/fufu/'.$_POST['cat'].'/original_'.uniqid('fu_').'.jpg';

我需要连接到 Amazon S3 并能够像这样更改代码:
$thisFu['original_img']='my_s3_bucket/uploads/fufu/'.$_POST['cat'].'/original_'.uniqid('fu_').'.jpg';

我已经为此目的配置了一个 IAM 用户,但我不知道完成这项工作所需的所有步骤。

如何连接 Amazon S3 并与之交互以上传和检索公共(public)图像?

更新

我决定按照建议尝试使用 s3fs,所以我按照 here 的描述安装了它(我的操作系统是 Ubuntu 14.04)

我从控制台运行:
sudo apt-get install build-essential git libfuse-dev libcurl4-openssl-dev libxml2-dev mime-support automake libtool
sudo apt-get install pkg-config libssl-dev
git clone https://github.com/s3fs-fuse/s3fs-fuse
cd s3fs-fuse/
./autogen.sh
./configure --prefix=/usr --with-openssl
make
sudo make install

一切都已正确安装,但下一步是什么?我应该在哪里声明凭据以及如何在我的项目中使用此集成?

第二次更新

我创建了一个名为 .passwd-s3fs 的文件带有我的 IAM 凭证的单个代码行 accessKeyId:secretAccessKey .

我把它放到我的 home/ubuntu目录并使用 chmod 600 ~/.passwd-s3fs 为其授予 600 权限

接下来从控制台运行 /usr/bin/s3fs My_S3bucket /uploads/fufu
里面 /uploads/fufu现在有我所有的存储桶文件夹。但是,当我尝试此命令时:
s3fs -o nonempty allow_other My_S3bucket /uploads/fufu

我收到此错误消息:
s3fs: unable to access MOUNTPOINT My_S3bucket : No such file or directory

第三次更新

正如建议的那样,我运行了 fusermount -u /uploads/fufu , 之后我检查了 fufu 文件夹并且如预期的那样是空的。
之后我再次尝试了这个命令(再加一个-o):
s3fs -o nonempty -o allow_other My_S3bucket /uploads/fufu

并收到此错误消息:
fusermount: failed to open /etc/fuse.conf: Permission denied
fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

还有什么建议吗?

第四次更新 2015 年 4 月 18 日

在控制台的建议下,我运行 sudo usermod -a -G fuse ubuntusudo vim /etc/fuse.conf我取消注释 mount_max = 1000 和 user_allow_other

比我运行 s3fs -o nonempty -o allow_other My_S3bucket/uploads/fufu

乍一看没有错误,所以我认为一切都很好,但事实恰恰相反。

我现在有点沮丧,因为我不知道发生了什么,但我的文件夹 /uploads/fufu被隐藏并使用 ls -Al我只看到这个
d????????? ? ?        ?              ?            ? fufu

我不能 sudo rm -r-rfmv -r它说 /uploads/fufu is a directory
我试过 reboot exit and mount -a ,但没有。

我尝试使用 fusermount 卸载错误信息是 fusermount: entry for /uploads/fufu not found in /etc/mtab
但是我尝试了 sudo vim/etc/mtab 并找到了这一行: s3fs /uploads/fufu fuse.s3fs rw,nosuid,nodev,allow_other 0 0
谁能告诉我如何卸载并最终删除此文件夹 /uploads/fufu ?

最佳答案

尽管“S3fs 在最近的版本中非常可靠”,但我可以分享我自己对 s3fs 的经验以及我们在周期性随机系统崩溃后将写入操作从直接 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:如果您不需要文件本地存储阶段,但将直接从上传表单中放置:
     $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',
    ));

    如果您将拥有公共(public)访问权限,则获取 s3 链接
    $publicUrl = $s3Client->getObjectUrl($bucket, $keyname);

    或者生成私有(private)内容的签名 url:
    $validTime = '+10 minutes';
    $signedUrl = $s3Client->getObjectUrl($bucket, $keyname, $validTime);

    关于amazon-web-services - 我如何在 PHP 上将上传的图像存储到 AWS S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29457382/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com