【问题标题】:How to upload files directly to S3 using PHP and with progress bar如何使用 PHP 和进度条将文件直接上传到 S3
【发布时间】:2011-09-26 11:06:37
【问题描述】:

有一些类似的问题,但没有一个关于如何使用带进度条的 PHP 将文件直接上传到 S3 的好的答案。不使用 Flash 甚至可以添加进度条吗?

注意:我指的是从客户端浏览器直接上传到 S3。

【问题讨论】:

  • 愿意使用 jQuery 和 ajax? stackoverflow.com/questions/2714507/…
  • 是的,我可以使用 jQuery 和 Ajax
  • 如果我错了,请纠正我,但是为了直接从客户端上传文件,您需要授予客户端上传权限,即使只是暂时的。这对您来说是可接受的安全权衡吗?

标签: php file-upload amazon-s3


【解决方案1】:

我在我们的项目中已经这样做了。由于标准的cross domain 安全策略,您不能使用 AJAX 直接上传到 S3;相反,您需要使用常规形式的 POST 或 Flash。您需要在一个相对复杂的过程中发送安全策略和签名,如S3 docs 中所述。

【讨论】:

    【解决方案2】:

    是的,可以在 PHP SDK v3 中执行此操作。

    $client = new S3Client(/* config */);
    
    $result = $client->putObject([
        'Bucket'     => 'bucket-name',
        'Key'        => 'bucket-name/file.ext',
        'SourceFile' => 'local-file.ext',
        'ContentType' => 'application/pdf',
        '@http' => [
            'progress' => function ($downloadTotalSize, $downloadSizeSoFar, $uploadTotalSize, $uploadSizeSoFar) {
                // handle your progress bar percentage
                printf(
                    "%s of %s downloaded, %s of %s uploaded.\n",
                    $downloadSizeSoFar,
                    $downloadTotalSize,
                    $uploadSizeSoFar,
                    $uploadTotalSize
                );
            }
        ]
    ]);
    

    这在 AWS 文档 - S3 Config section 中有说明。它通过暴露 GuzzleHttp 的 progress property-callable 来工作,如 this SO answer 中所述。

    【讨论】:

      【解决方案3】:

      从技术上讲,使用 PHP 你不能从客户端 --> S3。如果您想使用 PHP,您的解决方案必须设计如下:

      • 客户端 -> Web 服务器 (PHP) -> Amazon S3
      • 嵌入了 PHP 服务器的客户端 -> Amazon S3

      AWS PHP 开发工具包:http://aws.amazon.com/sdkforphp/ 编写得非常好,其中包含有关如何从客户端 --> 服务器 --> S3 发送文件的具体示例

      关于进度条,有很多选项可用。对 stackoverflow.com 的快速搜索显示了一个与此问题相同的问题:

      【讨论】:

      • 要直接发布到 s3,您需要在表单上签名。签署表格应该在服务器端完成,这样您就不会泄露您的凭据。所以这个答案的开头是不正确的。您可以并且应该使用 PHP 从客户端发布到 S3。
      【解决方案4】:

      可以直接上传,但是进度条不行: http://undesigned.org.za/2007/10/22/amazon-s3-php-class/

      请参阅下载中的 example_form, 从浏览器直接上传到 S3

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      • 您实际上可以将 HTML 5 用于上传进度条部分,所以...永远不应该使用不可能(尽管您写的时候是 2012 年):-)
      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 2013-06-03
      • 2016-10-17
      • 2011-06-29
      • 1970-01-01
      • 2019-12-06
      • 2014-08-11
      • 2012-04-11
      相关资源
      最近更新 更多