2008.05.16
category
comments

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");
        }
    }
}

PHPではbase64デコードで復元した後に受け取った拡張子でファイルを生成する。zipファイルはdataフォルダの中に出来上がる。解凍してみるとhelloworld1.txtとhelloworld2.txtの2ファイルが展開され、それぞれの文字列が書き込まれている。

generateZip.php5

PHP:
<?php
    $imgdata = base64_decode($_POST['data']);
    $type = $_POST['type'];
    $fileName = time()."-".round(rand(1,10000)).".".$type;
    $fp = fopen("data/".$fileName, 'wb');
    fwrite($fp, $imgdata);
    fclose($fp);
    print $fileName;
?>

最近ちょっとずつバイナリが分かってきて弄れるようになってきた。バイナリ触ってると変に快感があるなー。

2008.05.15
category
comments

PHP経由でBASIC認証を通過する

FlashPlayerのセキュリティー制限でAuthorizationのヘッダーを作成することは禁止されている。swfからBASIC認証を通過するにはいつものごとくPHPとかでproxyするしかないのかな(オーサリング環境からはBASIC認証を通過できる)。以下のコードはswfから「url」、「id」、「pass」をPOST通信でPHPに渡し、BASIC認証を通過する。認証通過後はサーバーから受け取ったデータをechoで出力させてswfに返してやる。これでswfとBASIC認証の先にあるAPIとやり取りできるようになる。

Main.as

ACTIONSCRIPT:
package
package
{
    import flash.display.Sprite;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod
    import flash.net.URLVariables;
    import flash.events.Event;
    import flash.text.TextField;
   
    public class Main extends Sprite
    {
        private var url:String = "http://***/basicproxy.php";
        private var id:String = "id";
        private var pass:String = "password";
       
        //------------------------------
        //   コンストラクタ
        //------------------------------
        public function Main()
        {
            //-----[送信するデータを格納]
            var variables:URLVariables = new URLVariables();
            variables.id = id;
            variables.pass = pass;
           
            //-----[リクエストの発行]
            var request:URLRequest = new URLRequest();
            request.url = url;
            request.method = URLRequestMethod.POST;
            request.data = variables;
           
            //-----[ローダーの設定]
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.TEXT;
            loader.addEventListener(Event.COMPLETE, onComplete);
            loader.load(request);
        }
       
        //------------------------------
        //   読み込み完了
        //------------------------------
        private function onComplete(e:Event):void
        {
            var loader:URLLoader = e.target as URLLoader;
            loader.removeEventListener(Event.COMPLETE, onComplete);
           
            trace(loader.data);
        }
    }
}

basicproxy.php

PHP:
<?php
    $url = $_POST["url"];
    $id = $_POST["id"];
    $pass  = $_POST["pass"];
   
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, "$id:$pass");
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    $data= curl_exec($ch);
    curl_close($ch);
   
    echo $data;
?>

curlを使うと簡単に認証を通過できる。あとは受け取ったデータを出力するだけ。

2008.05.12
category
comments

「ごはんとFlash」に行ってきた

dsc_2777

ごはんとFlash」に参加するため鎌倉のbowlsまで行ってきた。すんげー楽しかった。60人くらい集まってたので全員と話すことが出来なくて残念だったけど、立食がまさに正解で動きやすく色んな人と話しやすい雰囲気がありました。ll_koba_llさんも仰ってますが、ドメインやTwitterのアカウント名で覚えているので、自分が配った会社名刺とかはほとんど意味ないなと。名刺に自分のドメインを書かれている方もいて、それで声をかけるきっかけになったりもしました。後半で名刺を切らしてしまってすいませんでした。

社外のクリエーターの方と話が出来たのは本当に貴重で、色んな刺激や情報を頂くことが出来ました。勉強会とは違ったトークメインのイベントは今後も続いて欲しいです。結構みんなこういうのを待っていたんじゃないかと。

途中読み方が分からないブログの初級編でteraさんに弄ってもらいました。ありがとうございます。読み方は5ive(ファイブ)です。

KAYAC道家さんtrick7寺井さんFICC福岡さんを中心としたスタッフの皆様、楽しいイベントをありがとうございました。

2008.05.08
category
comments

GDライブラリが利用できるか確認する方法

レンタルサーバーにPHPのGDが入っているかどうか調べる場合のメモ。PHPファイルに以下を記述して、アップする。ブラウザで確認するとPHPの詳細が表示されるので、この中の「GD Support」が「enabled」になっていれば使用可能。他にも色んな情報が見れる。自分用メモ。

PHP:
<?php
    echo phpinfo();
?>

page 1 / 11