私の開発チェリーピーサーバーで動作するため、Webfaction 構成 (nginx プロキシがあり、私のアプリは apache2+mod_wsgi で実行されている webpy です) に関連している可能性があります。
アップロードに使用する JavaScript コードの一部を次に示します。
/* Bind drop events */
$(this).bind({
"dragover": function(e){
var dt = e.originalEvent.dataTransfer;
if(!dt) return;
if($.browser.webkit) dt.dropEffect = 'copy';
$(this).addClass("active");
return false;
},
"dragleave": function(e){
$(this).removeClass("active")
},
"dragenter": function(e){return false;},
"drop": function(e){
var dt = e.originalEvent.dataTransfer;
if(!dt&&!dt.files) return;
$(this).removeClass("active")
var files = dt.files;
for (var i = 0; i < files.length; i++) {
upload(files[i]);
}
return false;
}
})
/* Upload function code cut down to the basic */
function upload(file) {
var xhr = new XMLHttpRequest();
var xhr_upload = xhr.upload;
xhr_upload.addEventListener("progress", function(e){
if( e.lengthComputable ) {
var p = Math.round(e.loaded * 100 / e.total );
if(e.loaded == e.total){
console.log( e );
}
}
}, false);
xhr_upload.addEventListener( "load", function( e ){}, false);
xhr_upload.addEventListener( "error", function( error ) { alert("error: " + error); }, false);
xhr.open( 'POST', url, true);
xhr.onreadystatechange = function ( e ) { };
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("Content-Type", file.type);
xhr.setRequestHeader("X-File-Name", encodeURIComponent(file.fileName));
xhr.setRequestHeader("X-File-Size", file.fileSize);
xhr.send(file);
}
進行中のイベントのパーセンテージ値でスパンを埋めると、Safari では 0% から 100% になり、次に 50% から 100% になり、その後アップロードが完了します。Chrome と Firefox は問題ありません。
e.loaded == e.total
コンソールログにこれが表示されるため、アップロードごとに 2 回到達します。
コンソール ログ http://img824.imageshack.us/img824/4363/screenshot20110827at101.png
最初にログに記録されたイベントの totalSize はファイルのサイズと同じですが、2 番目のイベントでは 2 倍になります。