我的网站上有一个文件上传表单,当用户将其文件上传到我的服务器时,我想将此上传的文件从我的服务器传输到云服务器。文件可能很大,所以我决定将文件以 100KB 的部分发送到云端。
这是我的 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);
}
该代码实际上可以工作,除了一件事 - 每个部分都会覆盖以前的内容。在第一次循环的迭代中,在云上创建了 100KB 文件,在第二次迭代中,这 100KB 被另一个 100KB 替换。在最后一次迭代中,大约 28KB 正在上传,所以最后我在云服务器上有 28KB 文件而不是整个文件。我究竟做错了什么?我希望这些部分相互跟随,而不是替换。
以下是服务器响应,如果有帮助的话:
HTTP/1.1 201 创建日期:2013 年 8 月 13 日星期二 15:11:09 GMT 连接:关闭服务器:Selectel_Storage/1.0 最后修改时间:2013 年 8 月 13 日星期二 15:11:09 GMT 内容长度:0 etag:ea64231f21c952cdb57a5d3109415d09 内容-类型:文本/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 创建日期:2013 年 8 月 13 日星期二 15:11:10 GMT 连接:关闭服务器:Selectel_Storage/1.0 最后修改时间:2013 年 8 月 13 日星期二 15:11:10 GMT 内容长度:0 etag:07cf64ef10e96710b8cb48022ee5dd16 内容-类型:文本/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
提前致谢!