[英]AWS S3 PHP Progress Bar (Server to Cloud)
我的应用程序中有一个用PHP编写的图像上传系统。 文件浏览器打开,用户选择图像,我将其上传到我的服务器,我裁剪,我调整大小,我应用水印。 底线是我的服务器中的图像。 在某些时候,用户单击一个按钮,然后我将这些文件移动到我的S3存储桶。 当然,我需要一个进度条,因为ze客户想要一个进度条。
现在上传文件非常简单:
$result = $this->awsS3Client->putObject(array(
'Bucket' => 'bad-dum-tss-bucket',
'Key' => $destinationFilePath,
'SourceFile' => $sourceFilePath,
'ContentType' => $mimeType,
'ACL' => 'public-read',
));
我甚至可以多部分参与
$uploader = UploadBuilder::newInstance()
->setClient($this->awsS3Client)
->setSource($sourceFilePath)
->setBucket( 'bad-dum-tss-bucket')
->setKey($destinationFilePath)
->build();
try {
$uploader->upload();
} catch (MultipartUploadException $e) {
$uploader->abort();
}
没问题,直到我意识到我的客户需要一个惊人的进度条。 现在我已经搜索了很多,我所能看到的是上传者的链接,例如http://fineuploader.com/ ,它假定上传将直接从浏览器发生(即不是从我的服务器发生)。 所以PHP-progress吧-S3,任何人?
如果您仍然感兴趣,我找到了一种使用AWS SDK v3跟踪PHP进度的方法。
$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) {
printf(
"%s of %s downloaded, %s of %s uploaded.\n",
$downloadSizeSoFar,
$downloadTotalSize,
$uploadSizeSoFar,
$uploadTotalSize
);
}
]
]);
AWS文档 - S3 Config部分对此进行了解释。 它的工作原理是暴露GuzzleHttp的progress
属性 - 可调用,如本SO答案所述 。
我通过将并发XHR发送到服务器以轮询上载进度并将其保存到会话变量来实现此功能。 请参阅: 为什么我的XHR调用等待彼此返回响应 ,我在其中询问了与XHR轮询和会话阻塞相关的另一个问题,以实现此目的。
最后,我决定放弃所有这一切。 我的生产服务器是一个EC2实例,因此任何上传到S3服务器只需要很少的网络开销,(我应该早点意识到这一点)。 我可以在不到3秒的时间内传输几个MB的图像(我将需要的所有图像),所以我决定不显示进度条,因为它不能证明在我的各个部分添加令人讨厌的会话调用的成本是合理的。码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.