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

    大家都应该知道,在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);    

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

原文地址:https://www.cnblogs.com/liangquewei/p/1934466.html