3

HTTP PUTリクエストは、非常に大きなファイルのアップロード(1GB以上)に最適であることがわかりました。

このソリューションはうまく機能し、選択した任意のファイルをサーバーにアップロードできます。ただし、アップロードの進行状況を監視するのに問題があります。

onprogressコールバックを実装しましたが、ファイルがPUTを介してアップロードされた後、これは1回だけ呼び出されます。

私のJavaScriptコード:

var req = createRequest();
req.open("PUT", "PHP/upload_file.php?folder=" + aUploadedFile.upload_folder + "&master_folder=" + settings.strServerSideMasterFolder + "&file_name=" + aUploadedFile.file_name);
req.setRequestHeader("Content-type", "text/plain");
req.onload = function (event)
{
    console.log("OnLoad Called: " + aUploadedFile.file_name);
}
req.onprogress = function (event)
{
    console.log("OnProgress Called: " + aUploadedFile.file_name);
}
req.send(aUploadedFile.file_object);
  • PUTを介してアップロードの進行状況を監視したい場合のオプションは何ですか?
  • サーバーにアップロードされたファイルのサイズを監視する別のJavaScriptAJAX呼び出しを確立する必要がありますか?
  • 他に利用できる実用的なソリューションはありますか?

私が使う:

  • HTML5
  • JavaScript
  • PHP
  • Apache

私は使わない:

  • jQuery

前もって感謝します。

4

1 に答える 1

4

xhr.upload.onprogress代わりに試しましたxhr.onprogressか?

それでもうまくいかない場合は、あなたが言ったように、別のJavaScriptAJAX呼び出しを確立することができます。最近、ファイルを1行ごとに読み取るアップロードシステムを作成しましたが、パーセンテージだけでなく、アップロードに関する追加情報を表示する必要があったため、次のようにしました。

  • メインページは、ファイルの処理を担当するファイルに対してAJAXリクエストを行います
  • そのファイルでは、AJAXリクエストを完了できるように接続を閉じる必要がありましたが、次のコマンドを使用してPHPスクリプトが実行されたままになります。
ob_start();
$file = tempnam('/tmp', uniqid()); // create a temp file to show status of the action
echo json_encode(array('file' => $file));
header('Content-length: '.ob_get_length());
header('Connection: close');
ob_end_flush();
flush(); // The AJAX request is completed here, but the script is still running...

function writeToFile($handle, $arr) {
    ftruncate($handle, 0); // empty file
    fwrite($handle, json_encode($arr));
}
$handle = fopen($file, 'w');
while (readLine($uploadedFile)) {
    // code to process line
    writeToFile($handle, array('progress' => $current / $total, 'action' => 'Reading...'));
}
// insert into database
writeToFile($handle, array('progress' => '100', 'action' => 'Inserting into database...'));
fclose($handle);
  • setIntervalメインページで、AJAXリクエストは情報を含むファイルの名前を返すので、メソッドを使用してそのファイルにいくつかのGETリクエストを作成します

注:私の場合、進行状況ファイルの内容を表示するために別のPHPファイルを作成したfile_get_contentsので(を使用)、操作が完了したときにそのファイルを手動で削除できます

于 2013-03-02T14:05:33.587 に答える