主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JavaScript: 複数のバイナリデータファイルを加工してポストする to process and post multiple binary files

                
tags: JavaScript
JavaScript: Resize JPEG images without losing Exif

 前回に、FileReaderで読み込んだJPEGファイルをJavaScriptで加工してポストした。そのときはArrayBufferを使っており、一つのJPEGにつき一回ポストしていた。このポストをある程度まとめて、任意の容量でファイルをまとめてポストできるようにしたい。要はブラウザ上で加工された複数のJPEGをまとめてポストしたい。
 データが文字列型ならば話は簡単だが、今回はバイナリデータだ。さてどうしたものか。
 JPEGのセグメントを模倣して、一つのArrayBufferにデータをまとめてしまおう。JPEGは画像データの前に、セグメントデータというのが詰まっていた。
[JPEGファイルとしてのヘッダ] [[セグメントヘッダ:セグメントの長さ:セグメントデータ] × n] [EOF]
これを真似しつつ、今回は以下のようにデータを並べた。
["FILES"] [[バイナリデータの長さ+4(4 bytes):バイナリデータ] × n]
サーバ側ではバイナリデータの長さを読み込んで、それを参考にバイナリデータをファイルとして分けしていく。

 今回はJPEGが対象なので、バイナリデータはUint8Arrayに入っているものとしてスクリプトを書いた。サーバ側はPythonのGoogleAppEngine(Kay-Framework)を使っているが、リクエスト本文の取得さえ書き換えれば流用できる。

var oReq = new XMLHttpRequest();
oReq.open("POST", "/resize2", false);
oReq.setRequestHeader('Content-Type', 'application\/octet-stream');
var data = [70, 73, 76, 69, 83]; //FILES
for (var x=0; x<files.length; x++) // files: Uint8ArrayをArrayにまとめたもの
{
var file = files[x];
var length = file[0].length + 4;
var hexString = length.toString(16);
var tempLength = hexString.length;
if (length > Math.pow(256, 4)){throw "too large file to post";}
for (var y=0; y<(8 - tempLength); y++){hexString = "0" + hexString;}
var lenArray = [parseInt(hexString.slice(0,2), 16),
parseInt(hexString.slice(2,4), 16),
parseInt(hexString.slice(4,6), 16),
parseInt(hexString.slice(6,8), 16)
];
data = data.concat(lenArray);
for (var z=0; z<file[0].byteLength; z++)
{
data.push(file[0][z]);
}
}
var u8Array = new Uint8Array(data);
oReq.send(u8Array.buffer);


data = self.request.body
if data[0:5] == "FILES":
files = []
start = 5
while 1:
lengthStr = data[start: start + 4]
if len(lengthStr) != 4:
break
length = int(lengthStr[0].encode('hex'), 16) * 16777216 +\
int(lengthStr[1].encode('hex'), 16) * 65536 +\
int(lengthStr[2].encode('hex'), 16) * 256 +\
int(lengthStr[3].encode('hex'), 16)
if (length == 0): break
files.append(data[start + 4: start + length])
start = start+length
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。