AS3版的MsMultiPartFormData(适用于Flex与Flash上传二进流数据到服务器)

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);    

*******************************************************************


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值