「FileReference.download メソッドだとダイアログが開いちゃうな」に書いたように、インターネット上から自動でデータ取ってきて、ファイルの保存まで自動で行おうとすると、URLLoader でデータ取ってきて、FileStream で書き出すしかないみたい。
こんな感じ。
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
initialize="initProc()"
layout="absolute" width="348" height="202">
<mx:Label x="79" y="24" text="ダウンロードテスト" width="191" fontSize="18" textAlign="center" id="Title"/>
<mx:TextArea x="39" y="60" width="266" height="113" id="Message" text=""/>
<mx:Script>
<![CDATA[
import flash.events.*;
import flash.net.URLRequest;
import flash.net.URLLoader;
public static const FILE_GET_URI:String = "http://www.exsample.jp/data/ds.zip";
public var FileGet:URLLoader;
public var ZipFileName:String = "data/cont/ds.zip";
private function initProc():void {
FileGet = new URLLoader();
FileGet.dataFormat = URLLoaderDataFormat.BINARY; // バイナリ宣言
FileGet.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
FileGet.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
FileGet.addEventListener(Event.COMPLETE, onComplete);
Message.text += FILE_GET_URI + " Download Start.\n";
var request:URLRequest = new URLRequest();
request.url = FILE_GET_URI;
FileGet.load(request);
}
private function onIOError(evt:IOErrorEvent):void {
Message.text += "There was an IO Error.\n";
}
private function onSecurityError(evt:Event):void {
Message.text += "There was a security error.\n";
}
private function onComplete(evt:Event):void {
Message.text += "File was successfully downloaded.\n";
Message.text += "SIZE=" + FileGet.bytesTotal + "\n";
var file:File = File.applicationStorageDirectory.resolvePath(ZipFileName);
var stream:FileStream = new FileStream();
try {
stream.open(file,FileMode.WRITE);
stream.writeBytes(FileGet.data);
Message.text += "File Output Success. " + file.nativePath + "\n";
}
catch(error:IOError) {
Message.text += "File Output Error.\n";
}
finally {
stream.close();
}
}
]]>
</mx:Script>
</mx:WindowedApplication>
ちなみに、
FileGet.dataFormat = URLLoaderDataFormat.BINARY;
でバイナリデータ通信だと設定するのを忘れていて、writeBytes する時に
TypeError: Error #1034: Type Coercion failed: cannot convert "PKCDT to flash.utils.ByteArray.
というエラーが出ちゃってハマった。(^^;
FileGet.data を ByteArray にわざわざ型キャストしてみたり色々やってみたが駄目で、結局、通信モードをバイナリ型にするのを忘れていただけだった。とほほ。
ActionScript も日頃頻繁に使ってるわけではないので、こういうのがまだ身に染み付いてないんだよなあ。
コメントする