您的位置:首页 > 其它

Flex加载文件数据流

2010-07-21 11:35 246 查看
Flex加载文件数据流

本文使用URLStream,URLRequest,Loader实现数据流的加载,文件可以是图片、SWF等。

一、Flex代码

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<!--[CDATA[
import mx.controls.Alert;
import mx.rpc.soap.LoadEvent;

private var serverUrl:String = "http://localhost:4051/WebSite/DownloadStreamFile.aspx";
private var stream:URLStream;
private var loader:Loader;
private function loadPicture(event:MouseEvent):void
{
var urlRequest:URLRequest = new URLRequest();
stream = new URLStream();

urlRequest.url = serverUrl + "?file=1.jpg";
stream.addEventListener(Event.COMPLETE,onUrlRequestHandler);
stream.load(urlRequest);
}
private function onUrlRequestHandler(event:Event):void
{
if(stream.connected)
{
var b:int;
var bytes:ByteArray = new ByteArray();
try
{
do
{
b = stream.readByte();
bytes.writeByte(b);
}
while(true);
}
catch(e:EOFError)
{}
}

//创建Loader的遮罩层
//				var rect:Shape = new Shape();
//				rect.graphics.beginFill(0xFFFFFF);
//				rect.graphics.drawRect(0, 0, 1000, 1000);
//				rect.graphics.endFill();
loader = new Loader();
loader.addEventListener(Event.COMPLETE,onLoaderHandler)
loader.loadBytes(bytes);
//loader.mask = rect;
loader.alpha = 1;
loader.cacheAsBitmap = true;
loader.rotation = 0;
//此时加载的图片大小暂未找到获取方法,只好在预知图片大小的情况下将loader适当的缩放一定级别
loader.scaleX = 0.6;
loader.scaleY = 0.6
//Loader 对象只能有一个子显示对象,只能选择加载到Image或SWFLoader
//image.addChild(loader);
mySwfLoader.addChild(loader);
}
private function onLoaderHandler(event:Event):void
{
//Loader.loadBytes()时Event.COMPLETE不起作用??!!
Alert.show(loader.width.toString());
}

private function setSource(event:MouseEvent):void
{
var str:String = "http://localhost:2286/GetFile.aspx?path=DYDZ200907&file=4.swf";
mySwfLoader.source = str;
}
]]-->
</mx:Script>
<mx:Image x="61" y="105" id="image" width="199" height="142"/>
<mx:Button x="61" y="45" label="加载图片" click="loadPicture(event)"/>
<mx:Button x="436" y="45" label="加载到swfLoader" click="setSource(event)"/>
<mx:Canvas x="388" y="105">
<mx:SWFLoader id="mySwfLoader" scaleContent="true"/>
</mx:Canvas>
</mx:Application>


二、HttpService生成文件数据流代码

protected void Page_Load(object sender, EventArgs e)
{
string file = Request["file"];
if (string.IsNullOrEmpty(file))
return;
string filepath = Server.MapPath("~/Download/" + file);
if (File.Exists(filepath))
DownLoadStreamFile(filepath);
Response.End();
}

/// <summary>
/// 下载文件
/// </summary>
/// <param name="serverfilpath"></param>
/// <param name="filename"></param>
public static void ToDownload(string serverfilpath, string filename)
{
FileStream fileStream = new FileStream(serverfilpath, FileMode.Open);
long fileSize = fileStream.Length;
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=/"" + UTF_FileName(filename) + "/";");
////attachment --- 作为附件下载
////inline --- 在线打开
HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
byte[] fileBuffer = new byte[fileSize];
fileStream.Read(fileBuffer, 0, (int)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}

/// <summary>
/// 打开文件
/// </summary>
/// <param name="serverfilpath"></param>
/// <param name="filename"></param>
public static void ToOpen(string serverfilpath, string filename)
{
FileStream fileStream = new FileStream(serverfilpath, FileMode.Open);
long fileSize = fileStream.Length;
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=/"" + UTF_FileName(filename) + "/";");
HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
byte[] fileBuffer = new byte[fileSize];
fileStream.Read(fileBuffer, 0, (int)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}

private static string UTF_FileName(string filename)
{
return HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
}

/// <summary>
/// 下载文件数据流
/// </summary>
/// <param name="serverfilpath"></param>
public static void DownLoadStreamFile(string serverfilpath)
{
int blocksize = 1024 * 100;
byte[] buffer = new byte[blocksize];
byte[] fileHeader = new byte[101];

int startindex = 0;
int bytesread = 0;
int bytesfinish = 0;
int filesize = 0;
string headerText = string.Empty;
BinaryReader bReader = null;

bReader = new BinaryReader(File.OpenRead(serverfilpath));
filesize = Convert.ToInt32(bReader.BaseStream.Length);

while (bytesfinish < filesize)
{
if (bytesfinish + blocksize < filesize)
bytesread = bReader.Read(buffer, startindex, blocksize);
else
bytesread = bReader.Read(buffer, startindex, filesize - bytesfinish);

bytesfinish += bytesread;
HttpContext.Current.Response.OutputStream.Write(buffer, 0, bytesread);
}
bReader.Close();
HttpContext.Current.Response.End();
}


注:本示例加载时获取不到图片等文件的大小,显示时不精确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: