actionscript里面如何上传文件到服务端?

前言

最近看回以前的浮士德增强修改版,发现以前的图片上传方式不是规范,所以这里又拿了网上的一份代码改成了可以上传文件的形式。想要浮士德头像裁剪增强版源代码的话,后面会给出来的。

工具类

package easis.common
{
    import flash.events.*;
    import flash.net.*;
    import flash.utils.ByteArray;
    import flash.utils.Endian;

    /**
     * Take a fileName, byteArray, and parameters object as input and return ByteArray post data suitable for a UrlRequest as output
     *
     * @see http://marstonstudio.com/?p=36
     * @see http://www.w3.org/TR/html4/interact/forms.html
     * @see http://www.jooce.com/blog/?p=143
     * @see http://www.jooce.com/blog/wp%2Dcontent/uploads/2007/06/uploadFile.txt
     * @see http://blog.je2050.de/2006/05/01/save-bytearray-to-file-with-php/
     *
     * @author Jonathan Marston
     * @version 2007.08.19
     *
     * This work is licensed under a Creative Commons Attribution NonCommercial ShareAlike 3.0 License.
     * @see http://creativecommons.org/licenses/by-nc-sa/3.0/
     *
     */
    public class UploadPostHelper2{

        /**
         * Boundary used to break up different parts of the http POST body
         */
        private static var _boundary:String = "";

        /**
         * Get the boundary for the post.
         * Must be passed as part of the contentType of the UrlRequest
         */
        public static function getBoundary():String {

            if(_boundary.length == 0) {
                for (var i:int = 0; i < 0x20; i++ ) {
                    _boundary += String.fromCharCode( int( 97 + Math.random() * 25 ) );
                }
            }

            return _boundary;
        }
//      //要上传的图片
//      var one4data:Bitmap= model.scanvo.currentScanImage;
//      //图片转换成字符数组
//      //对传送数据编码(很重要)
//      var data:ByteArray=new JPGEncoder().encode(one4data.bitmapData); 
//      
//      var url:String="http://www.test.com/upload/UploadAction.action";//上传地址自己根据实际情况定
//      var request:URLRequest=new URLRequest(url);
//      //form表单提交,同时声明分隔符boundary
//      request.contentType="multipart/form-data; boundary="+UploadPostHelper.getBoundary();
//      request.requestHeaders.push(new URLRequestHeader( 'Cache-Control', 'no-cache'));
//      request.method=URLRequestMethod.POST;
//      //设置上传文件名和上传数据
//      
//      //getPostData()方法主要是根据RFC1867来处理数据
//      request.data=UploadPostHelper.getPostData("test.jpg",data );
        private var _req:URLRequest;
        private var _parameters={};
        private var _fileMap:Array=[];
        public function  UploadPostHelper2(url:String){
            _req=new URLRequest(url);
                    //form表单提交,同时声明分隔符boundary
                    _req.contentType="multipart/form-data; boundary="+UploadPostHelper2.getBoundary();
                    _req.requestHeaders.push(new URLRequestHeader( 'Cache-Control', 'no-cache'));
                    _req.method=URLRequestMethod.POST;          
        }
        /***
         * 添加参数进去。
         * ***/
        public function addParameter(key:String,value:String){
            _parameters[key]=value;
        }
        /****
         * 添加文件内容进去。
         * ***/
        public function addFile(fileName:String,uploadFieldName:String,fileContent:ByteArray){
            this._fileMap.push({
            fileName:fileName
            ,fieldName:uploadFieldName
            ,content:fileContent
            });


        }
        /***
         * 设定request的主体部分。
         * ***/
        private function setReqData(){
            var i: int;
            var bytes:String;

            var postData:ByteArray = new ByteArray();
            //更改或读取数据的字节顺序
            postData.endian = Endian.BIG_ENDIAN;

            //add Filename to parameters
            if(this._parameters== null) {
                this._parameters = new Object();
            }

            //遍历parameters中的属性
            //add parameters to postData
            for(var name:String in this._parameters) {
                postData = BOUNDARY(postData);
                postData = LINEBREAK(postData);
                bytes = 'Content-Disposition: form-data; name="' + name + '"';
                for ( i = 0; i < bytes.length; i++ ) {
                    postData.writeByte( bytes.charCodeAt(i) );
                }
                postData = LINEBREAK(postData);
                postData = LINEBREAK(postData);
                postData.writeUTFBytes(this._parameters[name]);
                postData = LINEBREAK(postData);
            }

            for(var j=0;j< this._fileMap.length;j++){
                var fileItem=this._fileMap[j];
                var uploadDataFieldName=fileItem.fieldName;
                var fileName=fileItem.fileName;
                var fileContent=fileItem.content;
                //add Filedata to postData
                postData = BOUNDARY(postData);
                postData = LINEBREAK(postData);
                bytes = 'Content-Disposition: form-data; name="'+uploadDataFieldName+'"; filename="';
                for ( i = 0; i < bytes.length; i++ ) {
                    postData.writeByte( bytes.charCodeAt(i) );
                }
                postData.writeUTFBytes(fileName);
                postData = QUOTATIONMARK(postData);
                postData = LINEBREAK(postData);
                bytes = 'Content-Type: application/octet-stream';
                for ( i = 0; i < bytes.length; i++ ) {
                    postData.writeByte( bytes.charCodeAt(i) );
                }
                postData = LINEBREAK(postData);
                postData = LINEBREAK(postData);
                postData.writeBytes(fileContent, 0, fileContent.length);
                postData = LINEBREAK(postData);
            }           


            //closing boundary
            postData = BOUNDARY(postData);
            postData = DOUBLEDASH(postData);        
            _req.data=postData;

        }

        public function getUrlRequest():URLRequest {
            this.setReqData();
            return this._req;
        }



        /**
         * Add a boundary to the PostData with leading doubledash 添加以双破折号开始的分隔符
         */
        private static function BOUNDARY(p:ByteArray):ByteArray {
            var l:int = UploadPostHelper2.getBoundary().length;

            p = DOUBLEDASH(p);
            for (var i:int = 0; i < l; i++ ) {
                p.writeByte( _boundary.charCodeAt( i ) );
            }
            return p;
        }

        /**
         * Add one linebreak 添加空白行
         */
        private static function LINEBREAK(p:ByteArray):ByteArray {
            p.writeShort(0x0d0a);
            return p;
        }

        /**
         * Add quotation mark 添加引号
         */
        private static function QUOTATIONMARK(p:ByteArray):ByteArray {
            p.writeByte(0x22);
            return p;
        }

        /**
         * Add Double Dash 添加双破折号--
         */
        private static function DOUBLEDASH(p:ByteArray):ByteArray {
            p.writeShort(0x2d2d);
            return p;
        }

    }

}

使用方式

            //生成编码容器
            var jpgEncoder:JPGEncoder = new JPGEncoder(100);
            //将位图数据编码到容器内成为ByteArray流
            //var jpgStream:ByteArray = jpgEncoder.encode(_srcBmd);
            var jpgStream = new ByteArray();
            jpgStream.writeBytes(jpgEncoder.encode(_newBmd));

            var jpgSrcStream=new ByteArray();
            jpgSrcStream.writeBytes(jpgEncoder.encode(_srcBmd));

            var uploadPostHelper=new UploadPostHelper2(_uploadUrl);

            uploadPostHelper.addFile("thumb.jpg",Param.imageUploadKey,jpgStream);
            if(Param.uploadSrc){
                uploadPostHelper.addFile("src.jpg",Param.imageSrcUploadKey,jpgSrcStream);
            }

            var jpgURLRequest:URLRequest = uploadPostHelper.getUrlRequest();
            var loader:URLLoader = new URLLoader();
            //loader.addEventListener(Event.COMPLETE, this.uploadComplete);
            loader.addEventListener(Event.COMPLETE, this.uploadComplete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, this.errorHandler);
            loader.load(jpgURLRequest);     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值