dion(現在au)から引っ越ししました

ブログ

201128日()

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()」が使える様になったようです。

2024年5月
2829301234
567891011
12131415161718
19202122232425
2627282930311
by ぱるかん ちゅん ちゅん ParKhang Cyung Cyung དཔར་ཁང་ཆུང་ཆུང་།