zoukankan      html  css  js  c++  java
  • 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);    

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

  • 相关阅读:
    web中的懒加载
    数据库表的关系
    struts2的MVC模式
    servlet与tomcat的关系
    servlet解析
    解决Mac外接显示器字体模糊的问题
    insmod: ERROR: could not insert module dm-snapshot.ko: Unknown symbol in module
    linux ssh tunnel
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).错误的解决
    Best practices for a new Go developer
  • 原文地址:https://www.cnblogs.com/liangquewei/p/1934466.html
Copyright © 2011-2022 走看看