Web サイトにファイル アップロード フォームがあり、ユーザーがそのファイルをサーバーにアップロードするときに、このアップロードされたファイルをサーバーからクラウド サーバーに転送したいと考えています。ファイルが大きくなる可能性があるため、ファイルを 100 KB ずつクラウドに送信することにしました。
これは、サーバーからクラウドにファイルを送信しようとする PHP コード サンプルです。
<?php
$cloud_server = '%my_server%';
$uploading_file_name = '%folders%/file.mp3';
$auth_token = '%token%';
$file_path = $_SERVER["DOCUMENT_ROOT"] . '/file.mp3';
$file_handler = fopen($file_path, 'rb');
$file_size = filesize($file_path);
$chunk_size = 100 * 1024;
$start_byte_position = 0;
while (!feof($file_handler)) {
$chunk_content = fread($file_handler, $chunk_size);
$chunk_content_length = strlen($chunk_content);
$final_byte_position = $start_byte_position + $chunk_content_length;
$socket_handler = fsockopen($cloud_server, 80, $errno, $errstr);
if (!$socket_handler)
die ($errstr);
//Headers
$request = "PUT /{$uploading_file_name} HTTP/1.1\r\n";
$request .= "Connection: Close\r\n";
$request .= "Host: {$cloud_server}\r\n";
$request .= "X-Auth-Token: {$auth_token}\r\n";
$request .= "Content-Range: {$start_byte_position}-{$final_byte_position}/{$file_size}\r\n";
$request .= "Content-Length: {$chunk_content_length}\r\n";
$request .= "\r\n";
//Body
$request .= $chunk_content;
$request .= "\r\n";
fwrite($socket_handler, $request);
$server_response = '';
while (!feof($socket_handler))
$server_response .= fgets($socket_handler, 128);
echo $server_response, '<br><br>';
$start_byte_position = $final_byte_position;
fclose($socket_handler);
}
このコードは実際には機能しますが、1 つのことを除いて、各部分が前のコンテンツを上書きします。最初のループの繰り返しで 100KB のファイルがクラウド上に作成され、2 回目の繰り返しでこれらの 100KB が別の 100KB に置き換えられます。最後の反復では、約 28KB がアップロードされているため、最終的に、ファイル全体ではなく、クラウドのサーバーに 28KB のファイルがあります。私は何を間違っていますか?これらの部品は交換するのではなく、相互に追従させたいと考えています。
それが役立つ場合のサーバーの応答は次のとおりです。
HTTP/1.1 201 Created Date: Tue, 13 Aug 2013 15:11:09 GMT Connection: close Server: Selectel_Storage/1.0 last-modified: Tue, 13 Aug 2013 15:11:09 GMT content-length: 0 etag: ea64231f21c952cdb57a5d3109415d09 content -タイプ: テキスト/html; 文字セット=UTF-8
HTTP/1.1 201 作成日: 2013 年 8 月 13 日 (火) 15:11:10 GMT 接続: 閉じる サーバー: Selectel_Storage/1.0 最終変更: 2013 年 8 月 13 日 (火) 15:11:09 GMT コンテンツの長さ: 0 etag: 01ab42f6ad58b401284540d6631dae9d コンテンツ-タイプ: テキスト/html; 文字セット=UTF-8
HTTP/1.1 201 作成日: 2013 年 8 月 13 日 (火) 15:11:10 GMT 接続: 閉じる サーバー: Selectel_Storage/1.0 最終変更: 2013 年 8 月 13 日 (火) 15:11:10 GMT コンテンツの長さ: 0 etag: 99bd6f0d3cefd75abc140b9359464d6d コンテンツ-タイプ: テキスト/html; 文字セット=UTF-8
HTTP/1.1 201 Created Date: Tue, 13 Aug 2013 15:11:10 GMT Connection: close Server: Selectel_Storage/1.0 last-modified: Tue, 13 Aug 2013 15:11:10 GMT content-length: 0 etag: 07cf64ef10e96710b8cb48022ee5dd16 content -タイプ: テキスト/html; 文字セット=UTF-8
................................................
HTTP/1.1 201 作成日: 2013 年 8 月 13 日 (火) 15:11:33 GMT 接続: 閉じる サーバー: Selectel_Storage/1.0 最終変更: 2013 年 8 月 13 日 (火) 15:11:33 GMT コンテンツの長さ: 0 etag: f01e66c96b21665bbbd19ee5e283a4e1 コンテンツ-タイプ: テキスト/html; 文字セット=UTF-8
前もって感謝します!