画像を保存する

こんばんは。

会社の古株なのに下っ端の自分は、昔からいることを理由に古いサービスは
基本的に見ないといけなく、業務負荷がとんでもないことになっています。
(古いサービスは品質がざるなのです。)

さて、会社で画像をダウンロードするアプリを作ったので、そのときのメモ。

■保存の流れ

これは説明するまでもないくらいですが・・・

  1. URLのコンテンツをダウンロードする
  2. ダウンロード完了後、コンテンツを保存する

■画像をダウンロードするURLLoader

URLLoaderを使えば、指定されたURLからコンテンツをダウンロードすることができます。


var urlRequest:URLRequest = new URLRequest(url);
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, function(e:Event):void{ onLoadComplete(e, savePath); });
loader.load(urlRequest);

ここでは、画像をダウンロード対象としているのでデータフォーマットはバイナリ形式を指定しています。

実際にダウンロードを行う前に、完了後に呼び出す関数をイベントリスナに登録します。

■イベントリスナに引数を一緒に渡す

今回の場合、保存先を引数として渡したいため、以下のような記述をしています。


function(e:Event):void{ onLoadComplete(e, savePath);

これにより、ダウンロードが完了すると、onLoadCompleteに保存先(savePath)を引数として渡すことができます。
他にも方法がありますが、個人的にしっくりきたのがこの方法でした。

参考:
http://blog.img8.com/archives/2008/04/003758.html

■ロードできたら保存

ダウンロードしたコンテンツは、URLLoaderのdataプロパティに保持されていいます。
ここでは、URLLoader(e.target).dataのようにして参照しています。
ファイルの保存は、FileStreamクラスを利用します。


private function onLoadComplete(e:Event, savePath:String):void
{
var file:File = new File(savePath);
var stream:FileStream = new FileStream();
var byteArr:ByteArray = new ByteArray();
stream.open(file, FileMode.WRITE);
stream.writeBytes(URLLoader(e.target).data);
}


全ソースと使い方は続きのページに載せますので、よければお使いください。

ソース

package
{
  import flash.events.Event;
  import flash.filesystem.File;
  import flash.filesystem.FileMode;
  import flash.filesystem.FileStream;
  import flash.net.URLLoader;
  import flash.net.URLLoaderDataFormat;
  import flash.net.URLRequest;
  import flash.utils.ByteArray;

  public class ImageService
  {

    /**
     * コンストラクタ
     */
    public function ImageService()
    {
    }

    /**
     *  URLのコンテンツをダウンロードし保存する
     */
    public function downloadImage(url:String, savePath:String):void
    {
      try {
        var urlRequest:URLRequest = new URLRequest(url);
        var loader:URLLoader = new URLLoader();
        loader.dataFormat = URLLoaderDataFormat.BINARY;
        loader.addEventListener(Event.COMPLETE, function(e:Event):void{ onLoadComplete(e, savePath); });
        loader.load(urlRequest);
      } catch (e:Error) {
        trace(e.getStackTrace());
      }
    }

    /**
     * URLのコンテンツをロード後に呼ばれ、コンテンツを保存する。
     */
    private function onLoadComplete(e:Event, savePath:String):void
    {
      var file:File = new File(savePath);
      var stream:FileStream = new FileStream();
      var byteArr:ByteArray = new ByteArray();
      try {
        stream.open(file, FileMode.WRITE);
        stream.writeBytes(URLLoader(e.target).data);
      } catch (e:Error) {
        trace(e.getStackTrace());
      } finally {
        stream.close();
      }
    }

  }
}

■使い方

var url:String = "http://www.hatena.ne.jp/images/logo_portal_hatena.gif";
var file:File = File.applicationDirectory.resolvePath("hatena.gif");
var imageService:ImageService = new ImageService();
imageService.downloadImage(url, file.nativePath);