【问题标题】:upload files to amazon s3 directly with php使用php直接将文件上传到amazon s3
【发布时间】:2014-12-28 20:53:28
【问题描述】:

已解决:使用此帖子:http://www.designedbyaturtle.co.uk/2013/direct-upload-to-s3-with-a-little-help-from-jquery/

编辑:我正在寻找一种方法,无需先将大 zip 文件从客户端上传到 amazon s3,而无需先将其上传到我的服务器

我正在为我的 web 应用程序使用一个小型服务器和 laravel 框架 我有一些用户试图将大文件上传到我的服务器(大约 300-400m),我的服务器很弱,我的带宽太低,用户无法完成上传。

我希望将文件直接上传到 amazon s3, 通过浏览,我认为这不能与亚马逊的 laravel sdk 一起使用

我安装了官方sdk 我正在尝试按照这篇文章中的建议进行操作 uploading posted file to amazon s3

但不确定如何将我的文件实际发送到亚马逊 s3, 我应该在“你的文件字符串”中放什么:

 $result = $client->upload(
'BUCKET HERE',
'OBJECT KEY HERE',
'STRING OF YOUR FILE HERE',
'public-read' // public access ACL
);

我像这样得到我的文件:

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

将 $myfile 而不是“您的文件字符串”放在此处不起作用

【问题讨论】:

  • 你试过$myFile->getRealPath()
  • 我实际上将 $myfile 作为数组获取,因为它可能是多个文件上传,但无论如何,$myFile[0]->getRealPath 的值为 bool(false),我认为这不是它假设有,并尝试发送它会给出无效的资源类型。我尝试手动在我的服务器上放置文件的路径,但它不起作用,只需在 s3 上放置一个以路径作为内容的文件
  • getRealPath() 工作不正常很奇怪。无论如何。尝试使用file_get_contents('path-to-your-file') 作为文件字符串
  • 好吧,它适用于常规的 txt 文件,但它不能帮助我发送上传的文件而不先将其上传到我的服务器。加上我上传的文件是一个 zip 文件,所以 file_get_contents 不起作用
  • 上传的文件 (Input::file()) 已经上传到您的服务器。它作为临时文件存储在某处。只需获取该文件路径,然后获取其内容即可。

标签: php laravel amazon-s3


【解决方案1】:

我使用这篇文章解决了这个问题:已解决:使用这篇文章:http://www.designedbyaturtle.co.uk/2013/direct-upload-to-s3-with-a-little-help-from-jquery/

【讨论】:

  • 链接已损坏。
【解决方案2】:

您可以将文件直接从客户端上传到 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',
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2011-09-01
    • 2012-09-11
    • 2013-06-03
    • 2010-09-12
    相关资源
    最近更新 更多