Multipart / form-data Flex HTTPService上传文件

时间:2012-10-03 16:06:44

标签: json flex file-upload multipartform-data httpservice

我是Flex新手,也是编写Web服务客户端的新手。 我的问题更多是关于Flex(Flash Builder 4.5)API,使用什么API。

我想访问一个Web服务,并为它创建一个Flex / AIRwrapper, 任何人都可以使用。

Here is the spec of webservice

  1. 我必须在POST https://build.phonegap.com/api/v1/apps
  2. 上发帖子
  3. 内容类型必须是“multipart / form-data”
  4. 请求的JSON主体应该具有“数据”的名称,并且将是这样的:

    data={"title":"API V1 App","package":"com.alunny.apiv1","version":"0.1.0","create_method":"file"}
    
  5. 在帖子的多部分正文中包含一个zip文件,参数名称为“file”。

  6. 我想创建一个'multipart / form-data'帖子并发送一个字符串和一个zip文件。

    我对自己的第一个问题是,如果我在体内发送两个字符串+二进制数据, 服务器将如何理解字符串结尾和zip文件的起始位置?

    然后我读了text + binary data can be sent through "multipart/form-data" post request的原因。必须有一些界限。

    在此之后,我在flex中阅读和示例并尝试遵循它。 http://codeio.wordpress.com/2010/04/03/5-minutes-on-adobe-flex-mimic-file-upload-for-in-memory-contents/ 但它似乎对我不起作用。

        public function createNewApp(cb:Function , appFile : File):void 
        {
            var service:HTTPService = new HTTPService();
            service.url = ROOT+"apps";
            service.showBusyCursor = true;
            service.addEventListener(ResultEvent.RESULT, function(e:ResultEvent):void {
                //translate JSON
                trace(e.result);
                var result:String = e.result.toString();
                var data:Object = JSON.parse(result);               
                cb(data.link);
            });
            service.addEventListener(FaultEvent.FAULT, defaultFaultHandler); //todo : allow user to add his own as well
            authAndUploadNewApp(service,appFile);
        }
    
        private function authAndUploadNewApp(service:HTTPService,appFile : File):void {
    
            var encoder:Base64Encoder = new Base64Encoder();
            encoder.encode(username + ":"+password);
            service.headers = {Accept:"application/json", Authorization:"Basic " + encoder.toString()};
            service.method ="POST";
            var boundary:String = UIDUtil.createUID();
            service.contentType = "multipart/form-data; boundary=—————————" + boundary;
            var stream:FileStream = new FileStream();
            stream.open(appFile, FileMode.READ);
            var binaryData:ByteArray = new ByteArray();             
            var fileData : String = new String();
            stream.readBytes(binaryData);
            stream.close();         
            fileData = binaryData.readUTFBytes(binaryData.bytesAvailable); // I think this is where I have problem.... how do 
                       //how do i converrt this bytearray/stream of data to string and send it in my post request's body - i guess if this step work rest should work..   
            var params: String = new String();
            var content:String = "—————————" + boundary + "nr";
            content += 'Content-Disposition: form-data; name="data";' + '{"title":"ELS test app 2","package":"com.elsapp.captivate","version":"12.3.09","create_method":"file"}' + "nr";
            content += "—————————" + boundary + "nr";
            content += 'Content-Disposition: form-data; name="file";' + fileData  + "nr";
            content += "—————————–" + boundary + "–nr";
            service.request = content;
            service.send();
        }
    

0 个答案:

没有答案