ブログ
2011年2月8日(火)
Chromeで大きなファイルをアップロード(チベットとは関係ありません)
(チベットとは関係ありません)
(1月ほど前に、登録しようと思いながら保留していたテキストです。検証していません。)
Google Chromeで、大きなファイルをサーバにアップロードする事を試みました。
サーバ側はPHPで処理しました。
8Gバイト以上の大きなファイルのアップロードができました。
Google Chrome が、File API の「slice()」を実装しているおかげです。
slice()で、大きなファイルを細切れにして、サーバに送り、サーバでそれらをくっつけます。
▼処理方法
■javaScript
以下の処理(抜粋)を、サーバとやりとりして、何度も行います。
doUp : function()
{
byte_reader = new FileReader();
byte_reader.onload = function(ev)
{
var postVal = (ev.target.result);
//↑この値をサーバに渡す
//▼http通信
var getVal = "[ファイルに関する情報]";
var url = '[受け取り].php' + getVal;
upHugeFile_http.open("POST",url,true);
upHugeFile_http.send(postVal);
//▲http通信
}
byte_reader.readAsBinaryString(fileObj.slice([始まり], [サイズ]));
}
■PHP
fopen("php://input", "r")
を使って、POSTの生(に近い)データを処理
▲処理方法
流れは、上記です。
ですが、このままでは、アップロードが1Gを超えたあたりで、Google Chrome がクラッシュしてしまいました。
chrome本体のメモリの使い過ぎです。
iFrameで対処しました。
上記の「http通信」の部分を、iFrameで処理させます。
サーバに1回分のデータを渡した後に、iFrameをリロードさせ、次のデータを送ってもらいます。
これで、8Gバイト以上の大きなファイルのアップロードに成功しました。
PHPは32ビットで動かしています。
このため、2Gを超えた辺りで、ファイルサイズの扱いが多少やっかいになります。
javaScriptも、整数としては2G(32ビット)までしか扱えませんが、浮動小数として、53ビットまでは桁落ちしないので、特別な対処は不要のようです。
(1月ほど前に、登録しようと思いながら保留していたテキストです。検証していません。)
以上です。
【20110502追加】
Google Chrome-11で、「slice()」は無くなり、代替で「webkitSlice()」が使える様になったようです。
Firefox-4.0.1で、「slice()」は無くなり、代替で「mozSlice()」が使える様になったようです。