我想为我的 Heroku 应用程序启用我的 Amazon S3 存储桶。
在 Heroku 之前,我是使用s3fs直接挂载目录的。现在这在 Heroku 上是不可能的,有没有其他方法可以将它们“链接”在一起,可能仍然保持上传(和调整大小)脚本仍然有效?
我想为我的 Heroku 应用程序启用我的 Amazon S3 存储桶。
在 Heroku 之前,我是使用s3fs直接挂载目录的。现在这在 Heroku 上是不可能的,有没有其他方法可以将它们“链接”在一起,可能仍然保持上传(和调整大小)脚本仍然有效?
根据您的脚本所做的事情,您可能需要对它们进行一些更改。
我应该首先声明我从未这样做过,所以我可能会遗漏一些细节,但根据我对 PHP、Heroku 和 S3 的经验,它应该像接受上传的文件一样简单(将存储在一个临时文件中) Heroku 服务器上的某个目录),调整它的大小,最后将它上传到 S3。
如果您已经有一个上传工作流工作,唯一的区别应该是不是将文件保存到服务器中的目录(根据您的说法,这实际上是一种指向 S3 存储桶的符号链接),您现在将将其上传到 S3。您可以使用此库轻松完成此操作:https ://github.com/tpyo/amazon-s3-php-class
像这样的东西:
// Ink is expensive, let's write less
$file = $_FILES['uploadedfile']['tmp_name'];
$name = $_FILES['pictures']['name'];
// Resize the image
resize($file);
// Normally you would do this for storing the file locally
// move_uploaded_file($file, "$destinationdir/$name");
// Now you want to upload to S3
$s3 = new S3($awsAccessKey, $awsSecretKey);
$s3->putObject($s3->inputFile($file, false), $bucketName, $uploadName, S3::ACL_PUBLIC_READ)
根据您组织上传的方式,您可能还希望记录存储桶名称和文件名,可能在数据库表中,您可以在其中搜索文件名并获取存储桶名称,因为您将需要两者检索文件。
我想应该还是可以的。您是否看过使用 AWS S3 存储静态资产和文件上传?
您需要手动获取上传的文件并上传到 S3,请记住,Heroku 具有只读文件系统,因此您无法在 Heroku 应用程序上创建临时文件,每个操作都需要在内存中完成。
// get uploaded file
$file = $_FILES['uploadedfile']['tmp_name'];
// do whatever manipulation on the file in memory
// $file = resize($file)
// upload file to S3, note, S3->putObjectFile won't work, as it require $file parameter to be string
if (S3::putObject(S3::inputFile($file), $bucket, $uri, S3::ACL_PRIVATE)) {
echo "File uploaded.";
} else {
echo "Failed to upload file.";
}
看起来 S3 php lib 没有用于从内存上传资源的 api,S3::inputFile 需要一个字符串作为输入,而不是在内存资源中。所以结论是:在 Heroku 上使用 S3 PHP 客户端是不可能的