Actionscript - 加载文件会冻结应用程序

时间:2013-11-17 01:49:34

标签: actionscript-3 flash

我想将用户计算机上的文件上传到我们的服务器。根据我的理解,我需要首先使用FileReference加载此文件,然后我可以将加载的字节发送到我们的服务器。

我正在使用FileReference.load方法加载文件。当文件很大~3MB时,应用程序会冻结,直到加载完成。

注意:我没有使用AIR,这是一个上传到网络的swf。

2 个答案:

答案 0 :(得分:0)

您可以使用FileStream类异步加载文件。

检查link

我已经为您复制了代码,如果链接过期,这对您有帮助。

import flash.filesystem.FileMode;
      import flash.filesystem.FileStream;
      import flash.filesystem.File;
      import flash.events.ProgressEvent;
      import flash.events.Event;

      // Declare the FileStream and String variables

      private var _fileStream:FileStream;

      private var _fileContents:String;

      private function onCreationComplete():void // Fired when the application has been created

      {

      var myFile:File = File.appResourceDirectory; // Create out file object and tell our File Object where to look for the file

      myFile = myFile.resolve("mySampleFile.txt"); // Point it to an actual file


      _fileStream = new FileStream(); // Create our file stream

      _fileStream.addEventListener(ProgressEvent.PROGRESS, onFileProgress); // Add our the progress event listener

      _fileStream.addEventListener(Event.COMPLETE, onFileComplete); // Add our the complete event listener

      _fileStream.openAsync(myFile, FileMode.READ); // Call the openAsync() method instead of open()

      }
      private function onFileProgress(p_evt:ProgressEvent):void // Event handler for the PROGRESS Event
      {
      _fileContents += _fileStream.readMultiByte(_fileStream.bytesAvailable, "iso-8859-1"); // Read the contens of the file and add to the contents variable

      fileContents_txt.text = _fileContents; // Display the contents. I've created a TextArea on the stage for display
      }

      private function onFileComplete(p_evt:Event):void // Event handler for the COMPLETE event

      {
      _fileStream.close(); // Clean up and close the file stream
      }

希望这有帮助

答案 1 :(得分:0)

我认为你没有理由用FileReference.load()加载文件。它有什么特别的原因吗?如果你加载文件,它将(无用地)占用内存。您是否在应用程序中使用该文件制作任何内容,或者只是想按原样上传它?

在纯上传的情况下,有一个更好的方法:FileReference.upload()(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#upload%28%29)。它将上载文件而不将其加载到Flash Player中。流程是一样的,你需要触发.browse(),听取select事件然后调用upload()。

编辑:顺便说一下,我不太清楚为什么你的应用程序冻结了。这不应该发生在.load()上 - 它是异步的。另外一个3MB的文件会快速加载闪电。或者至少它应该。在完成加载后你对文件做了什么,是不是冻结你的应用程序?