2

html5 チャンクを使用してファイル (約 4 GB の巨大なファイル) をアップロードするファイル転送プログラムを作成します。各チャンクのサイズは 100MB です (10MB を使用しようとしているので、理由もなくこれを選択しましたが、私が知る限り、実際には違いはありません)。

各チャンクを正しくアップロードします。アップロードが終わったら、ファイルを1つにマージしようとしますが、時間がかかります。アップローダの Web UI を更新しようとしても、マージが完了するまで機能しません。

私のマージコードは次のようなものです:

$final_file_path = fopen($target_path.$file_name, "ab");


//Reconstructed File
for ($i = 0; $i <= $file_total_chunk; $i++) {
    $file_chunk = $target_path.$file_name.$i;    

    if ( $final_file_path ) {
        // Read binary input stream and append it to temp file
        $in = fopen($file_chunk, "rb");
        if ( $in ) {
            //while ( $buff = fread( $in, 1048576 ) ) {
            while ( $buff = fread( $in, 104857600 ) ) {
                fwrite($final_file_path, $buff);
            }   
        }
        if(fclose($in)) {
            unlink($file_chunk);
        }        
    }
}

fclose($final_file_path);   

とにかく効率的かつ迅速に行う方法はありますか。私はPHPを使用しています。

ありがとうございました

4

2 に答える 2

2

exec関数でphpを使用するときに待ちたくない場合は、ワーカーからの非同期応答でギアマンワークキューを使用できます。ワーカー内で @hafichuk ソリューションを使用できます。キューは、アプリケーション全体をよりスケーラブルにします。

于 2013-01-08T00:05:20.083 に答える
2

おそらく、アップロードと連結プロセスを 2 つの別個のプロセスに分割することを検討する必要があります。アップロードと、ファイルがアップロードされたことを (Web ページ経由で) ユーザーに通知することは一緒に行うことができ、バックエンド処理はおそらく完全に別のプロセスで行う必要があります。

連結プロセスを処理するためのジョブ キューの設定を検討します。PHP アップロード スクリプトが完了すると、ジョブがキューに入れられ、サーバー上で実行されているデーモンがワーカーを生成して連結を行います。

個人的には、ワーカーに を使用して連結を行わせますcat

$> cat chunk_1 chunk_2 ... chunk_n > uploaded_file_name

それでも PHP でこれを行いたい場合は、次のようにします。

for ($1 = 0; $i <= $file_total_chunk; $i++) {
    $files[] = $target_path.$file_name.$i;
}

$catCmd = "cat " . implode(" ", $files) . " > " . $final_file_path;
exec($catCmd);

ファイル名がサニタイズされていることを確認してください。そうしないと、ここのコマンドラインで実行される任意のコードが挿入される可能性があります。

于 2013-01-07T22:57:06.777 に答える