2016-05-01 9 views
1

私はajaxを通してダウンロードするためのファイルを生成するスクリプトを持っています。誰もがファイルをダウンロードできるはずがないので、私はこの要求を制御する必要があります。ファイルをダウンロードして配信できないのですか?ヘッダーの問題と思われますか?

  1. 要求が処理され、すべてがOKであれば、一時ファイルは、ファイル名であることを最初の行で生成され
  2. サーバにデータをAjaxのリクエストを送信し、クリックイベントをリッスン:プロセスは次のようになりますさらに内容はダウンロードするファイルの内容です
  3. 新しく生成されたファイルのURLをajax関数に送り返し、非表示のiframeのsrc属性にそのエンドポイントを入力します。
  4. エンドポイントが呼び出され
  5. 、コントローラメソッドをチェックファイルが存在する場合、それを開き、array_shiftを用い$filename変数に最初の行を置き、$content変数へのコンテンツの残りの部分を置き、
  6. ためのヘッダーを設定ダウンロードして$content変数をエコーし​​ます。

これはどういうわけか、期待どおりに機能しません。 iframeのためではありません。ブラウザのURLにアクセスしたときに、ChromeでChromeのERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITIONエラーが通知されるためです。私はLaravelを使用していますが、どこに偽のヘッダーを設定したのか分かりません。

これまでにダウンロード・スクリプト:

public function download($fileId) 
{ 
    $file = $this->tempFilesPath . $fileId; 

    if (file_exists($file)) { 
     $data   = explode("\n", file_get_contents($file)); 
     //@unlink($file); 

     $fileName = array_shift($data); 
     $content = implode("\n", $data); 

     header('Content-Type: application/force-download'); 
     header('Content-Disposition: attachment; filename=' . $fileName); 

     echo $content; 
     exit; 
    } 
} 

$fileName$contentの値をダンプは、期待値を示しています。

提案?ありがとう。

+0

はい、ヘッダーとエラーがあるようです。 Haventはあなたのロジックを通過しましたが、http://stackoverflow.com/questions/386845/http-headers-for-file-downloadsを助けるためのリンクがあります。同様の点で、document.locationをリンクファイルはダウンロードされ、ダウンロードリンクにリダイレクトされません。 – georoot

+0

返信いただきありがとうございます。コンテンツタイプをapplication/octet-streamに変更しても問題ありませんでした。 – Ben

答えて

3

余分な掘り出しの後にI found a post that writes about this specific error。これは、ファイル名を日付でフォーマットしていて、Chromeを怒らせていたカンマが含まれていたためです。ファイル名の規則を変更しました。他の誰かがこの行動に後で遭遇する可能性がある場合は、質問をオンラインにしておきます。将来のソリューションを求める人のために

私は、最初のファイル$filename = 'download_' . date('d-m-Y, H:i:s') . '.ext'の名前が、日付形式のカンマが問題の原因でした。それを残しておけば、問題を解決するための一歩を踏み出すことができます。あなたがそうのようなあなたのダウンロード方法を変更することができ

+0

blogpostがオフラインになった場合の回答に関連するコードの変更を投稿してください。これは他人を助けるでしょう。 – shennan

+1

私は修正を述べました。しかし、さらに明確にするために、いくつかの例示的なコードを追加します。 – Ben

+0

ありがとうございます。それは将来誰かを助けるかもしれない。 – shennan

1

public function download($fileId) { 
    $file  = $this->tempFilesPath . $fileId; 

    if (file_exists($file)) { 
     //$data   = explode("\n", file_get_contents($file)); 
     //@unlink($file); 
     //$content = implode("\n", $data); 
     //$fileName = array_shift($data); 
     $size   = @filesize($file); 

     //ADD THESE FEW LINES 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 

     //header('Content-Type: application/force-download'); 
     header('Content-Disposition: attachment; filename=' . $fileId); 
     header('Content-Transfer-Encoding: binary'); 

     //header('Content-Length: ' . $size); 

     readfile($file); 
     return TRUE; 
    } 
} 
関連する問題