Heroku 上的 Amazon S3 和 PHP

Posted

技术标签:

【中文标题】Heroku 上的 Amazon S3 和 PHP【英文标题】:Amazon S3 on Heroku with PHP 【发布时间】:2012-07-18 15:07:04 【问题描述】:

我想为我的 Heroku 应用程序启用我的 Amazon S3 存储桶。

在 Heroku 之前,我使用 s3fs 直接挂载目录。现在这在 Heroku 上是不可能的,有没有其他方法可以将它们“链接”在一起,可能仍然保持上传(和调整大小)脚本仍然有效?

【问题讨论】:

S3 on github有几个php库。 您是如何处理这个问题的?以下任何答案有帮助吗?你是怎么解决的?还是你到现在都没有解决?您还可以举一个上传和调整脚本大小的示例吗? 你在做批处理吗?或者您是通过表单上传文件并即时将它们移动到 s3 存储桶?还是其他实现?这些信息将帮助我们回答。 http://net.tutsplus.com/tutorials/php/how-to-use-amazon-s3-php-to-dynamically-store-and-manage-files-with-ease/?search_index=3 此链接提供了如何将文件上传到 amazon s3 的分步说明。请查看此链接。 您的问题没有得到回答,因为它不清楚。 “链接”是什么意思?你到底想达到什么目的?有几个 PHP 库可以帮助您将文件上传到 S3。 【参考方案1】:

我想这仍然是可能的。你看过Using AWS S3 to Store Static Assets and File Uploads吗?

【讨论】:

是的。我需要的是“直通上传”选项。没有给出示例。 它指向 Paperclip gem,您可以找到更多关于它的信息:github.com/thoughtbot/paperclip。使用回形针(或carrierwave,另一种宝石)处理上传到 S3 的过程相当轻松。 如果这是一个相当轻松的过程,为什么没有人回答这个问题?【参考方案2】:

根据您的脚本的功能,您可能需要稍微更改它们。

首先我应该声明我从来没有这样做过,所以我可能会遗漏一些细节,但根据我在 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)

根据您组织上传的方式,您可能还希望保留存储桶名称和文件名的记录,也许在您可以搜索文件名并获取存储桶名称的数据库表中,因为您将两者都需要检索文件。

【讨论】:

【参考方案3】:

您需要手动获取上传的文件并上传到 S3,请记住,Heroku 有一个只读文件系统,因此您无法在 Heroku 应用程序上创建临时文件,每次操作都需要在内存中完成。

这里是S3 php api

一个例子:

// 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 客户端是不可能的

【讨论】:

以上是关于Heroku 上的 Amazon S3 和 PHP的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 显示来自 Amazon S3 的图像?

使用 Amazon S3 和 Cloudfront 的 CORS

如何将文件直接从 Django admin 上传到 Amazon S3?缓解 Heroku 应用程序错误(超时)

linode vs amazon ec2 vs heroku for amazon s3项目

为 Django Heroku 应用程序、Amazon S3 设置 MEDIA_URL

使用 php 从 Amazon s3 压缩和下载文件