2014-11-21 30 views
3

我在用PHP編寫的應用程序中有一個圖像上傳系統。文件瀏覽器打開,用戶選擇一個圖像,我上傳到我的服務器,我裁剪,我調整大小,我應用了一個水印。底線是圖像在我的服務器。在某個時候,用戶點擊一個按鈕,然後將這些文件移到我的S3存儲桶中。當然,我需要一個進度條,因爲客戶需要一個進度條。AWS S3 PHP進度條(服務器到雲)

現在上傳的文件是很容易的:

$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的進度條-S3,任何人?

+0

PhP(服務器端)進度條編號。然而......你試過這個嗎? http://www.w3bees.com/2013/12/multiple-file-upload-with-progress-bar.html它需要php和Javascript。否則,你根本無法完成進度條=) – 2014-11-21 09:29:32

+1

是的,當然,必須要有javascript才能顯示進度條,我忽略了這一點。 ajaxForm.uploadProgress的問題在於它不會檢測到S3上傳的進度。這是我最初的,但因爲文件已經在服務器中,進度條立即在100%,然後加載幾秒鐘,而實際的S3上傳正在進行,這顯然不是我想要的。 – turntwo 2014-11-21 09:33:35

回答

0

我通過向服務器發送併發XHR來輪詢上傳進度並將其保存到會話變量中,從而得到了這個結果。請參閱:Why are my XHR calls waiting for each other to return a response其中我問了另一個與XHR輪詢和會話阻塞有關的問題,以完成此操作。

儘管如此,我決定完全放棄這一切。我的生產服務器是一個EC2實例,所以任何上傳到S3服務器的網絡開銷都很小,(我應該早點實現這一點)。我可以在不到3秒的時間內傳輸幾張MB圖片(我所需要的所有內容),因此我決定不顯示進度條,因爲它無法證明在我的各個部分添加討厭的會話呼叫的成本碼。

+1

我和你一樣陷入混亂。客戶需要一個進度條。如果我直接上傳JS-> S3(js sdk),但憑證是純文本,則它正在工作。當然不好。現在我使用putObject工作JS-> PHP-> S3,但不知道如何獲取任何進度信息?沒有找到任何東西,除了像這樣的許多問題/答案,沒有最終的解決方案例子:D您是否有任何線索知道如何獲得進度信息?我需要使用會話嗎?因爲這對我的環境來說不是一個好主意...... – trainoasis 2016-08-25 10:18:32

2

如果您仍然感興趣,我找到了一種跟蹤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 section中有解釋。它通過暴露GuzzleHttp的progress屬性可調用來工作,如this SO answer中所解釋的。

+0

這很棒,但你怎樣才能使用進度輸出?輸出到一個js變量而不是屏幕? – 2017-05-30 21:44:36

+0

前端的實現取決於你。我個人使用websockets推進進度更新和引導進度條。 – 2017-05-30 21:46:34

+0

我正在使用ajax調用來上傳文件。我會發佈一個SO問題。謝謝 – 2017-05-30 22:37:40