2011-12-11 22 views
2

Flash AS3でのみ強制的にダウンロード機能を使用したいと思っていますか?私はGoogleを試みたが失敗した。ここで私のas3コード......Flash AS3でダウンロードForce AS3

var file_URLRequest:URLRequest = new URLRequest ("mp3gallery/" + url); 
var content_header:URLRequestHeader = new URLRequestHeader("Content-Type: application/force-download"); 
var attach_header:URLRequestHeader = new URLRequestHeader("Content-Disposition: attachment; filename=abc.mp3"); 

      file_URLRequest.requestHeaders.push(content_header); 
      file_URLRequest.requestHeaders.push(attach_header); 
      file_URLRequest.method = URLRequestMethod.POST; 

      navigateToURL(file_URLRequest, '_blank'); 

ありがとうございます。

+0

なぜAS3でのみ必要ですか?ブラウザへのmp3ファイルを提供するサーバのサイドページへの単純なnavigateToURLは十分ではないでしょうか? – ToddBFisher

+0

ブラウザにmp3ファイルを直接再生するブラウザで利用できるプラグインがいくつかありますが、私はそれを望んでいません..........私はPHPを試しましたが、http://stackoverflow.com/questionsのいくつかの問題/ 8458449/issues-with-force-download-in-php – hardik

+1

あなたはPHPでそれをやっているはずです。レスポンスヘッダーにはcontent-disposition:attachmentが付きますが、ブラウザプラグインがある場合は、そのプラグインをバイパスすることはできません。 –

答えて

1

これはdirectly from the docsです:

package { 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.net.FileFilter; 

public class FileReference_download extends Sprite { 
    private var downloadURL:URLRequest; 
    private var fileName:String = "SomeFile.pdf"; 
    private var file:FileReference; 

    public function FileReference_download() { 
     downloadURL = new URLRequest(); 
     downloadURL.url = "http://www.[yourDomain].com/SomeFile.pdf"; 
     file = new FileReference(); 
     configureListeners(file); 
     file.download(downloadURL, fileName); 
    } 

    private function configureListeners(dispatcher:IEventDispatcher):void { 
     dispatcher.addEventListener(Event.CANCEL, cancelHandler); 
     dispatcher.addEventListener(Event.COMPLETE, completeHandler); 
     dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
     dispatcher.addEventListener(Event.OPEN, openHandler); 
     dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
     dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
     dispatcher.addEventListener(Event.SELECT, selectHandler); 
    } 

    private function cancelHandler(event:Event):void { 
     trace("cancelHandler: " + event); 
    } 

    private function completeHandler(event:Event):void { 
     trace("completeHandler: " + event); 
    } 

    private function ioErrorHandler(event:IOErrorEvent):void { 
     trace("ioErrorHandler: " + event); 
    } 

    private function openHandler(event:Event):void { 
     trace("openHandler: " + event); 
    } 

    private function progressHandler(event:ProgressEvent):void { 
     var file:FileReference = FileReference(event.target); 
     trace("progressHandler name=" + file.name + " bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal); 
    } 

    private function securityErrorHandler(event:SecurityErrorEvent):void { 
     trace("securityErrorHandler: " + event); 
    } 

    private function selectHandler(event:Event):void { 
     var file:FileReference = FileReference(event.target); 
     trace("selectHandler: name=" + file.name + " URL=" + downloadURL.url); 
    } 
} 
} 

EDITは:ユーザー(クリック)のアクションが必要な場合がありますので、この方法を使用している場合、これは動作しませんでした。そのため、コンストラクタに含まれるコードをメソッド(クリックハンドラ)に移動する必要があります。もちろん、この場合btnはステージに配置されたムービークリップのインスタンス名で、FileReference_downloadはDocumentClassです。

public function FileReference_download() { 
      btn.addEventListener(MouseEvent.MOUSE_DOWN, downloadMyFile); 
     } 

     private function downloadMyFile(e:MouseEvent){ 
      downloadURL = new URLRequest(); 
      downloadURL.url = "http://www.[yourDomain].com/SomeFile.pdf"; 
      file = new FileReference(); 
      configureListeners(file); 
      file.download(downloadURL, fileName); 
     }