「https://github.com/blueimp/jQuery-File-Upload」プラグインを使用して、100MB のチャンクで 4GB のファイルをアップロードします。クライアントとサーバーのやり取りを調べたところ、2GB が読み込まれた後にアップロードが失敗していることに気付きました。firebug コンソールを調べると、プラグインが 2GB のコンテンツ範囲で同じ 100MB のチャンクを再送信しようとしているようです。以下の要求/応答ヘッダーと、プラグインによって提供されるデフォルトの php ライブラリを使用してサーバーから受信した応答を示しています。
最初の出力は 1.8GB - 1.9GB の転送を表します。2 番目の出力は 1.9GB - 2GB の転送を表します。3 番目の出力は、次の AJAX リクエストで発生するものです。別の部分を転送しようとしているように見えます。サーバーは、以前返されていた通常の「video/mp4」ではなく、「type」属性を「multipart/form-data」に設定する、わずかに異なる JSON メッセージで応答します。クライアントの jquery-file-upload は、手動で停止されるまで、同じ範囲でさらに AJAX リクエストをサーバーに送信し続けます。
サーバー環境 Apache/2.2.22、「PHP 5.3.10-1ubuntu3.7 with Suhosin-Patch」、「Ubuntu 12.04.1 LTS」。
クライアント環境 Windows 7、Firefox 24。
クライアント側 Javascript の実装:
<script src="/js/vendor/jquery.ui.widget.js"></script>
<script src="/js/jquery.iframe-transport.js"></script>
<script src="/js/jquery.fileupload.js"></script>
<script>
$(function () {
'use strict';
$('#fileupload').fileupload({
maxChunkSize: 100000000, // 100 MB */
url: '/uploadify/jquery_video_upload_submit',
dataType: 'json',
done: function (e,data) {
$.each(data.result.files, function (index, file) {
$('<p/>').text(file.name).appendTo('#files');
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>
サーバー側の実装
public function jquery_video_upload_submit(){
$this->output->set_header('Content-Type: application/json; charset=utf-8');
error_reporting(E_ALL | E_STRICT);
$this->load->library('uploadHandler');
}
観察された出力 1:
応答ヘッダー
Access-Control-Allow-Cred... false
Access-Control-Allow-Head... Content-Type, Content-Range, Content-Disposition
Access-Control-Allow-Meth... OPTIONS, HEAD, GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Orig... *
Cache-Control no-store, no-cache, must-revalidate
Connection Keep-Alive
Content-Disposition inline; filename="files.json"
Content-Length 204
Content-Type application/json; charset=utf-8
Date Mon, 21 Oct 2013 15:02:28 GMT
Keep-Alive timeout=5, max=93
Pragma no-cache
Range 0-1899999999
Server Apache/2.2.22 (Ubuntu)
Vary Accept
X-Content-Type-Options nosniff
リクエスト ヘッダー
Accept application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Disposition attachment; filename="block%20burner%20movie%2011.1.10(1).mp4"
Content-Length 100000211
Content-Range bytes 1800000000-1899999999/4122624072
Content-Type multipart/form-data; boundary=---------------------------1694899034803
Cookie ci_session=****;
Host dev.****.tv
Referer http://dev.****.tv/tests/jqueryfileupload
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
X-Requested-With XMLHttpRequest
応答:
{"files":[{"name":"block burner movie 11.1.10(1).mp4","size":1900000000,"type":"video\/mp4","deleteUrl":"http:\/\/dev.****.tv\/?file=block%20burner%20movie%2011.1.10%281%29.mp4","deleteType":"DELETE"}]}
観察された出力 2:
応答ヘッダー
Access-Control-Allow-Cred... false
Access-Control-Allow-Head... Content-Type, Content-Range, Content-Disposition
Access-Control-Allow-Meth... OPTIONS, HEAD, GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Orig... *
Cache-Control no-store, no-cache, must-revalidate
Connection Keep-Alive
Content-Disposition inline; filename="files.json"
Content-Length 204
Content-Type application/json; charset=utf-8
Date Mon, 21 Oct 2013 15:03:27 GMT
Keep-Alive timeout=5, max=92
Pragma no-cache
Range 0-1999999999
Server Apache/2.2.22 (Ubuntu)
Vary Accept
X-Content-Type-Options nosniff
リクエスト ヘッダー
Accept application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Disposition attachment; filename="block%20burner%20movie%2011.1.10(1).mp4"
Content-Length 100000215
Content-Range bytes 1900000000-1999999999/4122624072
Content-Type multipart/form-data; boundary=---------------------------280133237112097
Cookie ci_session=****
Host dev.****.tv
Referer http://dev.****.tv/tests/jqueryfileupload
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
X-Requested-With XMLHttpRequest
応答
{"files":[{"name":"block burner movie 11.1.10(1).mp4","size":2000000000,"type":"video\/mp4","deleteUrl":"http:\/\/dev.****.tv\/?file=block%20burner%20movie%2011.1.10%281%29.mp4","deleteType":"DELETE"}]}
観測された出力 3:
応答ヘッダー
Access-Control-Allow-Cred... false
Access-Control-Allow-Head... Content-Type, Content-Range, Content-Disposition
Access-Control-Allow-Meth... OPTIONS, HEAD, GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Orig... *
Cache-Control no-store, no-cache, must-revalidate
Connection close
Content-Disposition inline; filename="files.json"
Content-Length 266
Content-Type application/json; charset=utf-8
Date Mon, 21 Oct 2013 15:04:26 GMT
Pragma no-cache
Range 0-1999999999
Server Apache/2.2.22 (Ubuntu)
Vary Accept
X-Content-Type-Options nosniff
リクエスト ヘッダー
Accept application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Disposition attachment; filename="block%20burner%20movie%2011.1.10(1).mp4"
Content-Length 100000213
Content-Range bytes 2000000000-2099999999/4122624072
Content-Type multipart/form-data; boundary=---------------------------23653531328930
Cookie ci_session=****
Host dev.****.tv
Referer http://dev.****.tv/tests/jqueryfileupload
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
X-Requested-With XMLHttpRequest
応答
{"files":[{"name":"block burner movie 11.1.10(1).mp4","size":2000000000,"type":"multipart\/form-data; boundary=---------------------------23653531328930","deleteUrl":"http:\/\/dev.****.tv\/?file=block%20burner%20movie%2011.1.10%281%29.mp4","deleteType":"DELETE"}]}