使用PHP直接将文件上传到Amazon S3

4
解决方案:使用这篇文章:http://www.designedbyaturtle.co.uk/2013/direct-upload-to-s3-with-a-little-help-from-jquery/
编辑:我正在寻找一种直接从客户端上传大型zip文件到亚马逊S3而无需先将其上传到我的服务器的方法。
我在使用Laravel框架的小型服务器来运行我的Web应用程序。有些用户试图向我的服务器上传大文件(约300-400M),但我的服务器太弱,带宽太低,用户无法完成上传。
我希望文件能够直接上传到亚马逊S3,浏览了一下,我认为这不能通过Laravel SDK for Amazon实现。
我安装了官方SDK,并尝试按照此帖子中建议的方式进行操作:uploading posted file to amazon s3
但是不确定如何将我的文件发送到亚马逊S3,应该在“your file string here”的位置放置什么?
 $result = $client->upload(
'BUCKET HERE',
'OBJECT KEY HERE',
'STRING OF YOUR FILE HERE',
'public-read' // public access ACL
);

我是这样获取文件的:

$myFile = Input::file('file');

替换“string of your file here”为$myfile并不能生效。

1
你尝试过 $myFile->getRealPath() 吗? - lukasgeiter
我实际上会将$myfile作为一个数组获取,因为它可能是多文件上传,但无论如何,$myFile[0]->getRealPath的值为bool(false),我认为这不是它应该有的值,尝试发送它会产生无效的资源类型。我尝试手动在我的服务器上放置一个文件路径,但它不起作用,只需在s3上放置一个以路径为内容的文件即可。 - Daniel Katzan
好的,它可以使用普通的txt文件,但是它不能帮助我在将上传的文件上传到服务器之前发送它。此外,我的上传文件是一个zip文件,因此file_get_contents无法工作。 - Daniel Katzan
上传的文件(Input::file())已经上传到您的服务器。它以临时文件的形式存储在某个位置。只需要获取该文件路径,然后获取其内容即可。 - lukasgeiter
不是真的。我也没有任何关于Amazon S3的实际经验。我建议你稍微重新表达一下你的问题,我相信会有人知道答案。 - lukasgeiter
显示剩余3条评论
2个回答

4

链接已损坏。 - Haridarshan

1
您可以直接从客户端上传文件到 S3,但这是一种安全风险,因为您无法验证文件,而且让任何人都可以访问您的 S3 存储桶通常都不是一个好主意。我建议您仍然应该考虑通过 Laravel 应用程序上传。
所有上传到 PHP 的文件都存储在您的服务器上,很可能是 Linux 和 Mac 机器上的 /tmp 目录中。没有办法避免这个问题,文件需要存储在某个地方。使用 Input::file('file') 获取表示文件的对象。
该文件是 Symfony\Component\HttpFoundation\File\UploadedFile 的实例,它公开了 getRealPath() 方法。然后我们可以使用 fopen() 将文件内容读取为字符串。因此,要将其上传到 S3,请使用:
$client->upload(
  'bucket',
  'key',
  fopen($file->getRealPath(), 'r'),
  'public-read',
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接