2015-02-25 3 views
0

Я пытаюсь использовать File.upload для ActionScript для загрузки файла в Air SDK для среды iOS, но File.upload работает неправильно. Никакой обработчик о загрузке файла не выполняется после того, как вызывается File.upload, и исключение не будет обнаружено. Когда я проверяю сетевой трафик на стороне сервера, я обнаружил, что никакой HTTP-запрос даже не попал на сервер после выполнения File.upload. Код ниже.Файл.файла ActionScript не работает в Air SDK для устройств iOS.

<?xml version="1.0" encoding="utf-8"?> 
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 

    <fx:Script> 
     <![CDATA[ 

      private var file:File; 
      private var dir:File; 

      //This method is executed to create a file and upload it when the Upload Button is pressed. 
      protected function OnUploadButtonPressed(event:MouseEvent):void{ 
       trace("upload button clicked"); 

       var urlReq:URLRequest = new URLRequest("http://10.60.99.31/MyPath/fileUploadTest.do"); 
       urlReq.method = URLRequestMethod.POST; 

       var str:String = 'This is test'; 

       var imageBytes:ByteArray = new ByteArray(); 
       for (var i:int = 0; i < str.length; i++) { 
        imageBytes.writeByte(str.charCodeAt(i)); 
       } 

       trace("size = " + imageBytes.length); 

       try{ 
        dir = File.applicationStorageDirectory 
        //I also tested in several different directories 
        //dir = File.createTempDirectory(); 
        //dir = File.documentsDirectory; 
        var now:Date = new Date(); 
        var filename:String = "IMG" + now.fullYear + now.month + now.day + now.hours + now.minutes + now.seconds + now.milliseconds + ".txt"; 
        file = dir.resolvePath(filename); 
        var stream:FileStream = new FileStream(); 
        stream.open(file, FileMode.WRITE); 
        stream.writeBytes(imageBytes); 
        stream.close(); 

        //Read back the file contents to check whether the file is written successfully. 
        var readStream:FileStream = new FileStream(); 
        readStream.open(file, FileMode.READ); 
        var result:String = readStream.readUTFBytes(readStream.bytesAvailable); 
        trace("read back result = " + result);//The result is shown here as expected. 

        file.addEventListener(Event.COMPLETE, uploadComplete); 
        file.addEventListener(IOErrorEvent.IO_ERROR, ioError); 
        file.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError); 
        file.addEventListener(ErrorEvent.ERROR, someError); 
        file.addEventListener(ProgressEvent.PROGRESS, onProgress); 


        file.upload(urlReq);//This line does not work. No handler is executed. No http request hit the server side. 
        trace("after file upload test"); 
       } 
       catch(e:Error) 
       { 
        trace(e); 
       } 
      } 

      //Complete Handler 
      private function uploadComplete(event:Event):void 
      { 
       trace("Upload successful."); 
      } 

      //IOError handler 
      private function ioError(error:IOErrorEvent):void 
      { 
       trace("Upload failed: " + error.text); 
      } 

      //SecurityError handler 
      private function securityError(error:SecurityErrorEvent):void{ 
       trace("Security error:" + error.text); 
      } 

      //Other handler 
      private function someError(error:ErrorEvent):void{ 
       trace("some error" + error.text); 
      } 

      //Progress handler 
      private function onProgress(event:ProgressEvent):void{ 
       trace("progressHandler"); 
      } 


      //This method is executed to invoke the URLLoader.load when the Tricky Button is pressed. 
      protected function OnTrickyButtonPressed(event:MouseEvent):void{ 
       var urlReq:URLRequest = new URLRequest("http://200.60.99.31/");//This points to a non-existed server 
       urlReq.method = URLRequestMethod.POST; 

       urlReq.data = new ByteArray(); 
       var loader:URLLoader = new URLLoader(); 

       try{ 
        loader.load(urlReq);//This line seems very important in iOS7. It decides whether the latter file.upload can work. 
             //But in iOS8, file.upload does not work even if this line is executed. 
        trace("after urlloader load"); 
       }catch(e:Error){ 
        trace(e); 
       } 
      } 


     ]]> 

    </fx:Script> 

    <s:Button x="200" y="200" width="400" height="200" label="Upload" click="OnUploadButtonPressed(event)" /> 
    <s:Button x="200" y="500" width="400" height="200" label="Tricky" click="OnTrickyButtonPressed(event)" /> 
</s:View> 

При выполнении на Air Simulator, он отлично работает, как ожидалось, и файл успешно загружен на сервер. Но когда вы выполняете на устройствах iOS (в моем случае iPad), как я объясняю раньше, никакой обработчик о загрузке файла не выполняется, и на сервер не попадает запрос HTTP-запроса. Так что я думаю, что проблема может быть на стороне клиента.

Во время моей попытки решить проблему, я нашел кое-что сложное об этой проблеме на iOS7. То есть, если вы вызываете метод URLLoader.load (даже если URLLoader.load указывает на несуществующий адрес) перед вызовом метода File.upload, File.upload будет работать как ожидается на iOS7. Более конкретно, когда метод OnTrickyButtonPressed выше выполняется перед методом OnUploadButtonPressed, File.upload преуспеет на iOS7. Но это происходит только на iOS7. В iOS8 File.upload всегда отказывается работать, независимо от того, выполняется ли раньше URLLoader.load.

Я думаю, что в моем случае проблема не в проблеме с песочницей или в проблеме сеанса Firefox, описанной в двух ссылках ниже, потому что даже ни один HTTP-запрос не попал на серверную сторону. Кажется, что Air SDK для iOS просто не смог отправить HTTP-запрос по какой-то причине.

Flex 4 FileReference Issues With Firefox

How do I make Flex file upload work on firefox and safari?

Чтобы сделать мою проблему более ясно, я перечисляю мое окружение ниже:

  • Develoment Окружающая среда: Windows7 (64bit)/Mac OS 10.9.4 (Проверено на две платформы ОС.)
  • IDE: Flash Builder 4.7
  • Air SDK: 3,8/16.0.0 (после обновления до Lastest Air SDK 16.0.0 , проблема все еще существует.)
  • Application Server: Tomcat7 + Spring

Наконец, я хотел бы что загрузка файла с помощью URLLoader.load не является вариантом в моем случае, потому что я хочу загрузить большие файлы в будущем, с которыми нельзя обращаться с URLLoader.load.

Я боролся за это в течение многих дней. Поэтому я очень ценю это, если кто-нибудь имеет представление об этом. Спасибо заранее.

+0

Если вы действительно застрял с этой проблемой, вы можете сделать небольшой проект, представляющий эту проблему, и загрузить его Somwhere. У меня никогда не было проблем с file.upload –

+0

Дорогой Дмитрий, большое спасибо за ваш ответ. Я сделаю небольшой проект и загружу его как можно скорее. Спасибо. – bluewind

+0

Дорогой Дмитрий, я загрузил файл проекта flex SimpleFileUpload.fxp по следующему адресу. [https://github.com/bluewindjava8/actionscript_file_upload_for_ios](https://github.com/bluewindjava8/actionscript_file_upload_for_ios). Я действительно очень ценю вашу помощь. Большое спасибо. (Я загружаю только клиентский код, потому что в моем случае проблема заключается в том, что клиентская сторона не отправляет запрос на сервер. Так что на стороне сервера выглядит неважно.) Жду вашего ответа. – bluewind

ответ

0

Наконец-то я обнаружил, что реальная проблема заключается не в коде, который я предоставил, а в настройке конфигурации прокси-сервера http, и эта проблема возникла на iOS7 и iOS8. Я подробно описал проблему и обходную проблему в следующей ссылке. Надеюсь, это поможет некоторым из вас.

https://forums.adobe.com/thread/1716036