2012-01-18 1 views
0

제대로 작동하도록 만드는이 작은 AIR 응용 프로그램을 가져올 수 없습니다. 무대에는 버튼 하나가 있으며, 사용자가 버튼을 누르면 파일 브라우저 (FileReference.browse() 함수)가 표시됩니다. 그들이 이미지 파일을 선택하면 이미지를 imgur.com 사이트 (http://www.api.imgur.com)에 업로드하고 싶습니다.AIR : POST 기반 웹 서비스 (AS3)로 FileReference.upload()를 사용하는 방법

imgur에서 응답을 받고 있는데 내 앱이 연결되었음을 알았지 만 "업로드 API에 이미지 데이터가 전송되지 않았습니다."라는 오류가 표시됩니다. 어떤 도움이라도 대단히 감사합니다!

패키지 {

import flash.display.MovieClip; 
import flash.events.*; 
import flash.net.*; 
import flash.utils.ByteArray; 


public class Document extends MovieClip 
{ 
    //file browser var 
    var myFileReference:FileReference = new FileReference(); 

    //file loader var 
    private var loader:URLLoader; 

    //string constants 
    private const API_KEY:String = "******REMOVED*******"; 
    private const UPLOAD_URL:String = "http://api.imgur.com/2/upload.xml"; 

    public function Document() 
    { 
     // constructor code 
     browse_btn.addEventListener(MouseEvent.CLICK, browse); 
    } 

    function browse(e:MouseEvent) 
    { 
     var imagesFilter:FileFilter = new FileFilter("Images", "*.jpg;*.gif;*.png"); 
     myFileReference.browse([imagesFilter]); 
     myFileReference.addEventListener(Event.SELECT, selectHandler); 
     myFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, responseHandler); 
    } 

    function selectHandler(e:Event):void 
    {        
     var vars:String = "?key=" + API_KEY + "&name=name&title=title"; 
     var params:URLVariables = new URLVariables(); 
     params.date = new Date(); 
     var request:URLRequest = new URLRequest(UPLOAD_URL + vars); 
     //request.contentType = "application/octet-stream"; 
     request.contentType = "multipart/form-data"; 
     request.method = URLRequestMethod.POST; 
     request.data = params; 

     myFileReference.upload(request); 
     try 
     { 
      myFileReference.upload(request); 
     } 
     catch (error:Error) 
     { 
     trace("Unable to upload file."); 
     } 
    } 

    function responseHandler(e:DataEvent):void 
    { 
     trace("responseHandler() initaialized"); 
     var res:XML = XML(e.data); 
     trace(res); 
    } 
} 

}

+0

'FileReference'입니다 로컬 파일에 접근하기 위해서만 - URLLoader 인스턴스를 사용하여 서버에 raw 이미지 데이터를 보내야한다. flashplayer에 파일을 열고 (FileReference를 사용하여) + BitmapData 객체를 만든 다음 ByteArray (PNGEncoder/JPEGEncoder ...)로 변환하여이 "raw"데이터를 섬기는 사람. – pkyeck

+0

도움을 주셔서 감사합니다! 당신이 제안한 방법으로 작동하게했습니다. 그러나, 나는 시도하고 큰 파일 (5-7mb) swf 잠금 및 io 스트림 오류를 반환합니다. 어떤 생각? – Prefix

+0

음, 잘 모르겠 음. 플래시는 최대 100MB의 파일을 처리 할 수 ​​있어야합니다. 정확히 무엇이 오류입니까? 어쩌면 imgur-API에서 업로드 제한이 있습니다!? – pkyeck

답변

1

실제로 자신의 사이트에 AS3에 대한 예제있다 (또한 나는 :) 단지 분명한 이유이 게시물에서 그것을 제거하는 API 키가 수행) :

package 
{ 
    import com.adobe.images.PNGEncoder; 
    import flash.display.BitmapData; 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.SecurityErrorEvent; 
    import flash.events.IOErrorEvent 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.utils.ByteArray; 

    public class ImgurExample 
    { 
     private var loader:URLLoader; 

     private const API_KEY:String = "<api key>"; 
     private const UPLOAD_URL:String = "http://api.imgur.com/2/upload.xml"; 

     public function ImgurExample() { 

      loader = new URLLoader(); 
      loader.dataFormat = URLLoaderDataFormat.VARIABLES; 
      loader.addEventListener(Event.COMPLETE, onCookieSent); 
      loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); 
      loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 

      // Create a bitmapdata instance of a movieclip on the stage. 
      var mc:MovieClip; 
      var b:BitmapData = new BitmapData(mc.width, mc.height, true); 
      b.draw(mc); 
      var png:ByteArray = PNGEncoder.encode(b); 

      var vars:String = "?key=" + API_KEY + "&name=name&title=title"; 
      var request:URLRequest = new URLRequest(UPLOAD_URL + vars); 
      request.contentType = "application/octet-stream"; 
      request.method = URLRequestMethod.POST; 
      request.data = png; // set the data object of the request to your image. 

      loader.load(request); 
     } 
     // privates 
     private function onSend(e:Event):void { 
      var res:XML = new XML(unescape(loader.data)); 
      trace(res); 
     } 
     private function onIOError(e:IOErrorEvent):void { 
      trace("ioErrorHandler: " + e); 
      // Handle error 
     } 
     private function onSecurityError(e:SecurityErrorEvent):void { 
      trace("securityErrorHandler: " + e); 
      // handle error 
     } 

    } 
} 

http://api.imgur.com/examples

+0

답장을 보내 주셔서 감사 합니다만, 이미 AS3 예제를 체크 아웃했는데이 라이브러리에 외부 라이브러리를 사용하고 싶지 않습니다. (PNGEncoder는 as3-corelib의 일부입니다.) 모든 이미지를 인코딩하고 싶지는 않습니다. 사용자가 PNG로 선택합니다. 파일 형식을 그대로 유지하고 싶습니다. : / – Prefix

관련 문제