在Flash AS3中上传图片的一般方法为 FileReference 的 upload 方法.
但前提是图片是存在于客户端本地的文件,而不能是存在于内存的数据流。也就是说,在Flash运行过程中生成的图片,除非先用save方法保存至磁盘,否则不可。
我在找寻答案的过程中,曾经听说应将图片数据转换为Base64字符串来传输,但这会使传输量大增,说明此并非好方法。
一个可以使用的方法是,将图片保存为byteArray,通过 URLLoader来上传。在服务器端,将其接收保存成图片。
[Flash 端]
//截图
var jpgSource:BitmapData=new BitmapData();
jpgSource.draw(一个DisplayObjectContainer);
//将图片保存为 ByteArray
var jpgEncoder:JPGEncoder=new JPGEncoder(100); var jpgStream:ByteArray=jpgEncoder.encode(jpgSource);
//使用URLRequest,URLLoader来上传
var request:URLRequest = new URLRequest(后台接收图片的url);
var loader:URLLoader = new URLLoader();
//data值就为图片编码数据ByteArray;
request.data = jpgStream; request.method = URLRequestMethod.POST; //传输内容类型必须是下面文件流形式; request.contentType = "application/octet-stream"; loader.addEventListener(Event.COMPLETE, completeHandler); loader.load(request);
private function completeHandler(e:Event):void{
trace(e.target.data); }
[.net 端]
protected void Page_Load(object sender, EventArgs e)
{ if (true) { string saveToFolder = "要保存的位置"; string Path = Server.MapPath(saveToFolder);
//通过Resquest.InputStream解收的是Stream形式,转换成byte[]形式
Stream s = Request.InputStream;
byte[] bt = StreamToBytes(s);
//将byte[]形式转换成MemoryStream形式,再保存为图片
System.IO.MemoryStream ms = new System.IO.MemoryStream(bt);
System.Drawing.Bitmap b = new System.Drawing.Bitmap(ms);
b.Save(Path + "/proj.jpg");
Response.Write(true);
Response.End();
}
}
//此函数将Stream转换成byte[]
public byte[] StreamToBytes(Stream stream)
{ byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始 stream.Seek(0, SeekOrigin.Begin); return bytes; }