http://www.cnblogs.com/liangquewei/archive/2011/01/13/1934466.html
大家都应该知道,在W3C的标准当中,当我们想在一个From元素当中同时上传字段与文件二进制流的时候,我们需要使用HTTP标准当中的multipart/form-data,这种格式是如何组织的,W3C已经有明确的规定,在这里不多说,大家可以上网找找资料,看看就明白了。为什么我要开发这个一个AS3版的MsMultiPartFormData呢?因为目前Flash提供的上传文件类,确实不适合我们的系统需求。我们需要把从摄像头获取到的数据,与一些自己添加的字段数据,传到一个页面当中,而这些页面的实现技术可能是多样化的,JSP的,ASP.NET的,PHP的,ASP的等等,我们考虑过自己定义一种数据格式来进行数据的上传,可是那服务器端数据的解析也就得定制化了,后来考虑采用标准的W3C规定,我们决定采用 HTTP当中的multipart/form-data数据格式,于是进行学习,并封装了一个帮助进行数据打包的类,具体代码如下(后面我还会提供一个调用的例子,后面有这种需求的朋友,可以参考一下,之前我在这空间里也提供过C++版本的MsMultiPartFormData了,方便采用C++进行开发的朋友们使用,其实这个MsMultiPartFormData的来源是来自Delphi开发套件中的一个开源的套件,具体看我原来的文章):
********************************************************************
package
{
import flash.text.*;
import flash.utils.*;
/**
* 用于打包multipart/form-data格式HTTP数据包的类
* @author qwliang
*/
public class MsMultiPartFormData
{
public var Boundary:String= "---------------------------7db1851cd1158";
private var fieldName:String="Content-Disposition: form-data; name=\"XXXX\"";
private var fieldValue:String= "XXXX";
private var fileField:String="Content-Disposition: form-data; name=\"XXXX\"; filename=\"XXXXXXXX\"";
private var fileContentType:String= "Content-Type: XXXX";
private var formData:ByteArray;
/**
* ...
* @author qwliang
*/
public function MsMultiPartFormData ()
{
formData=new ByteArray();
}
/**
* 添加一个字段数据到From的数据包中
* @author qwliang
*/
public function AddFormField( FieldName:String, FieldValue:String):void
{
var newFieldName:String=fieldName;
var newFieldValue:String=fieldValue;
newFieldName=newFieldName.replace("XXXX",FieldName);
newFieldValue=newFieldValue.replace("XXXX",FieldValue);
formData.writeMultiByte( "--"+Boundary+"\r\n","UTF-8");
formData.writeMultiByte( newFieldName+"\r\n\r\n","UTF-8");
formData.writeMultiByte( newFieldValue+"\r\n","UTF-8");
}
/**
* 添加一个文件二进流数据到Form的数据包中,并指定二进流数据的类型
* @author qwliang
*/
public function AddFile( FieldName:String, FileName:String,FileContent:ByteArray, ContentType:String):void
{
var newFileField:String=fileField;
var newFileContentType:String=fileContentType;
newFileField=newFileField.replace("XXXX",FieldName);
newFileField=newFileField.replace("XXXXXXXX",FileName);
newFileContentType=newFileContentType.replace("XXXX",ContentType);
formData.writeMultiByte( "--"+Boundary+"\r\n","UTF-8");
formData.writeMultiByte( newFileField+"\r\n","UTF-8");
formData.writeMultiByte( newFileContentType+"\r\n\r\n","UTF-8");
formData.writeBytes(FileContent,0,FileContent.length);
formData.writeMultiByte("\r\n","UTF-8");
}
/**
* 添加一个文件二进流数据到Form的数据包中
* @author qwliang
*/
public function AddStreamFile( FieldName:String, FileName:String,FileContent:ByteArray):void
{
AddFile( FieldName, FileName, FileContent,"application/octet-stream");
}
/**
* 把Form中所有的字段与二进制流数据打包成一个完整的From数据包
* @author qwliang
*/
public function PrepareFormData():void
{
formData.writeMultiByte( "--"+Boundary+"--","UTF-8");
}
/**
* 获得From的完整数据
* @author qwliang
*/
public function GetFormData():ByteArray
{
return formData;
}
}
}
******************************************************************
具体的调用代码很简单,这里大家看看应该就清楚了,呵呵。
******************************************************************
var form:MsMultiPartFormData=new MsMultiPartFormData();
form.AddFormField("devilField","devilField");
form.AddStreamFile("fileUpload","你的文件名.jpg",这里就是你要上传的ByteArray);
form.PrepareFormData();
var request:URLRequest=new URLRequest("http://localhost/Test.aspx");
var header:URLRequestHeader = new URLRequestHeader ("Content-Type", "multipart/form-data; boundary="+form.Boundary);
request.requestHeaders.push(header);
request.method="POST";
request.data = form.GetFormData();
var load:URLLoader = new URLLoader(request);
*******************************************************************