Zip Libraryで複数ファイルを圧縮してみる
テキストファイルをzip圧縮してサーバーに保存してみる。今回はnochump.comのライブラリを使わせてもらう。ここからダウンロードしてクラスパスを通しておく。
流れとしてはまず、ファイル名を任意に決めてバイトストリームにUTF-8ストリングを書き込む。putNextEntry()でファイルにしたいエントリーをぶち込む。write()メソッドで実際のデータを書き込み、zipOut.closeEntry()で閉じる。複数のテキストファイルをまとめてzip圧縮するには、下のコードのように文字列を書き込んだ後にzipOut.closeEntry()をそれぞれに実行してやればよい。後はZipOutputクラスからbyteArrayを取り出してPHPに送信してやるだけ。送信の際はBase64エンコードをかける。
Main.as
ACTIONSCRIPT:
package
{
import flash.display.Sprite;
import flash.events.ProgressEvent;
import flash.events.Event;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLLoader;
import flash.net.URLVariables;
import flash.utils.ByteArray;
import mx.utils.Base64Encoder;
import nochump.util.zip.ZipOutput;
import nochump.util.zip.ZipEntry;
public class Main extends Sprite
{
private var url:String = "generateZip.php5";
//------------------------------
// コンストラクタ
//------------------------------
public function Main()
{
var fileName1:String = "helloworld1.txt";
var fileName2:String = "helloworld2.txt";
var fileData1:ByteArray = new ByteArray();
var fileData2:ByteArray = new ByteArray();
var ze1:ZipEntry = new ZipEntry(fileName1);
var ze2:ZipEntry = new ZipEntry(fileName2);
var zipOut:ZipOutput = new ZipOutput();
//-----[ファイル1]
fileData1.writeUTFBytes("ハローワールド1!");
zipOut.putNextEntry(ze1);
zipOut.write(fileData1);
zipOut.closeEntry();
//-----[ファイル2]
fileData2.writeUTFBytes("ハローワールド2!");
zipOut.putNextEntry(ze2);
zipOut.write(fileData2);
zipOut.closeEntry();
zipOut.finish();
var zipData:ByteArray = zipOut.byteArray;
sendZip(zipData);
}
//------------------------------
// zipデータの送信
//------------------------------
private function sendZip(byteArr:ByteArray):void
{
//-----[Base64エンコード]
var enc:Base64Encoder = new Base64Encoder();
enc.encodeBytes(byteArr);
//-----[送信変数のセット]
var variables:URLVariables = new URLVariables();
variables.data = String(enc.flush());
variables.type = "zip";
//-----[リクエストの発行]
var urlRequest:URLRequest = new URLRequest();
urlRequest.url = url;
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = variables;
//-----[送信]
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(ProgressEvent.PROGRESS, onProress);
urlLoader.addEventListener(Event.COMPLETE, onComplete);
urlLoader.load(urlRequest);
}
//------------------------------
// 読み込み途中
//------------------------------
private function onProress(e:ProgressEvent):void
{
trace(e.bytesLoaded + " / " + e.bytesTotal);
}
//------------------------------
// 読み込み完了
//------------------------------
private function onComplete(e:Event):void
{
e.target.removeEventListener(ProgressEvent.PROGRESS, onProress);
e.target.removeEventListener(Event.COMPLETE, onComplete);
trace("complete");
}
}
}
{
import flash.display.Sprite;
import flash.events.ProgressEvent;
import flash.events.Event;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLLoader;
import flash.net.URLVariables;
import flash.utils.ByteArray;
import mx.utils.Base64Encoder;
import nochump.util.zip.ZipOutput;
import nochump.util.zip.ZipEntry;
public class Main extends Sprite
{
private var url:String = "generateZip.php5";
//------------------------------
// コンストラクタ
//------------------------------
public function Main()
{
var fileName1:String = "helloworld1.txt";
var fileName2:String = "helloworld2.txt";
var fileData1:ByteArray = new ByteArray();
var fileData2:ByteArray = new ByteArray();
var ze1:ZipEntry = new ZipEntry(fileName1);
var ze2:ZipEntry = new ZipEntry(fileName2);
var zipOut:ZipOutput = new ZipOutput();
//-----[ファイル1]
fileData1.writeUTFBytes("ハローワールド1!");
zipOut.putNextEntry(ze1);
zipOut.write(fileData1);
zipOut.closeEntry();
//-----[ファイル2]
fileData2.writeUTFBytes("ハローワールド2!");
zipOut.putNextEntry(ze2);
zipOut.write(fileData2);
zipOut.closeEntry();
zipOut.finish();
var zipData:ByteArray = zipOut.byteArray;
sendZip(zipData);
}
//------------------------------
// zipデータの送信
//------------------------------
private function sendZip(byteArr:ByteArray):void
{
//-----[Base64エンコード]
var enc:Base64Encoder = new Base64Encoder();
enc.encodeBytes(byteArr);
//-----[送信変数のセット]
var variables:URLVariables = new URLVariables();
variables.data = String(enc.flush());
variables.type = "zip";
//-----[リクエストの発行]
var urlRequest:URLRequest = new URLRequest();
urlRequest.url = url;
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = variables;
//-----[送信]
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(ProgressEvent.PROGRESS, onProress);
urlLoader.addEventListener(Event.COMPLETE, onComplete);
urlLoader.load(urlRequest);
}
//------------------------------
// 読み込み途中
//------------------------------
private function onProress(e:ProgressEvent):void
{
trace(e.bytesLoaded + " / " + e.bytesTotal);
}
//------------------------------
// 読み込み完了
//------------------------------
private function onComplete(e:Event):void
{
e.target.removeEventListener(ProgressEvent.PROGRESS, onProress);
e.target.removeEventListener(Event.COMPLETE, onComplete);
trace("complete");
}
}
}
PHPではbase64デコードで復元した後に受け取った拡張子でファイルを生成する。zipファイルはdataフォルダの中に出来上がる。解凍してみるとhelloworld1.txtとhelloworld2.txtの2ファイルが展開され、それぞれの文字列が書き込まれている。
generateZip.php5
PHP:
最近ちょっとずつバイナリが分かってきて弄れるようになってきた。バイナリ触ってると変に快感があるなー。
FLASH(AIR)でZIPファイルを作成する。
http://www.5ive.info/blog/archives/98 のサ…
>K Blogさま
トラックバックありがとうございます。ユニークファイルの扱いについてですが、FileRefferenceを使ってアップロードだけをするAIRを作って、PHP側で受け取ったファイルをzip圧縮すればいけるんじゃないでしょうか?実際に試してないので、空想の話になりますが・・・。