画像を保存する
こんばんは。
会社の古株なのに下っ端の自分は、昔からいることを理由に古いサービスは
基本的に見ないといけなく、業務負荷がとんでもないことになっています。
(古いサービスは品質がざるなのです。)
さて、会社で画像をダウンロードするアプリを作ったので、そのときのメモ。
■保存の流れ
これは説明するまでもないくらいですが・・・
- URLのコンテンツをダウンロードする
- ダウンロード完了後、コンテンツを保存する
■画像をダウンロードする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)を引数として渡すことができます。
他にも方法がありますが、個人的にしっくりきたのがこの方法でした。
■ロードできたら保存
ダウンロードしたコンテンツは、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);