2016-06-16 46 views
0

私はLaravelを使用して複数のファイルをS3バケットにアップロードしていますが、クライアント側で進捗データを正しく取得できません。 Laravelの側で進捗バー付きAWS S3に複数のファイルをアップロード

var xhr = new XMLHttpRequest(); 
xhr.addEventListener("progress", updateProgress, false); 
xhr.addEventListener("load", transferComplete, false); 
xhr.open("POST", "my_url_to_upload"); 
xhr.send(formData);//formData is defined earlier and contains multiple files 

function updateProgress(e) { 
    console.log('updateProgress', e); 
} 

function transferComplete(e) { 
    console.log("Files uploaded successfully.", e); 
} 

::これは素晴らしい限りS3バケットにファイルをアップロードするように動作

$files = \Input::file('file'); 
$s3  = \Storage::disk('s3'); 
foreach ($files as $file) 
    { 
    $file_name = "/some_folder/" . $file->getClientOriginalName(); 
    $s3->put($file_name, file_get_contents($file), 'public'); 
    } 

クライアント側で

私は、次の(簡易)を持っています。

複数のファイルをアップロードするとき、クライアント側のupdateProgress関数は、(各ファイルの後ではなくアップロード中に)すべてのファイルがアップロードされたときにのみ呼び出されるという問題があります。

理想的には、ファイルのアップロード中にプログレスバーが定期的に更新されるため、大容量のファイルをアップロードするときにリアルタイムで進行状況が表示されるようになります。

アップロード中に進捗状況を報告するにはどうすればLaravel(または一般的にPHP)を取得できますか?ここで

答えて

1

は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) { 
      printf(
       "%s of %s downloaded, %s of %s uploaded.\n", 
       $downloadSizeSoFar, 
       $downloadTotalSize, 
       $uploadSizeSoFar, 
       $uploadTotalSize 
      ); 
     } 
    ] 
]); 

これは、AWSのドキュメントで説明されて - S3 Config section。これは、this SO answerで説明されているようにGuzzleHttpのprogressを呼び出し可能にすることで機能します。

少し違っていると思いますが(Streamsの場合)、あなたのニーズに合わせて調整することができます。

関連する問題