2013-03-05 12 views
17

私はZF2を使用してダウンロードを強制しようとしています。ZF2を使用して強制ダウンロード

A valid request line was not found in the provided string 

スタックトレース:

#0 /var/www/whowantsmymoney/module/Admin/src/Admin/Controller/LanguageController.php(93): Zend\Http\Request::fromString('Content-Type: a...') 
+0

代わりの新しいリクエストオブジェクトをインスタンス化し、既存の応答を取得する必要があります。 $ this-> getResponse()を試してみてください。ヘッダーを設定したら、応答を返す必要があります。 –

+0

私が既存のヘッダーを使用していなかった唯一の理由は、既存のヘッダーには必要なコンテンツがなく、新しいものを作成しなければならないということでした。 –

答えて

36

このコードは助けるべきである。ここに私のコードのスニペット

use Zend\Http\Request; 
..... 
    public function downloadAction() { 
    $response = new Request(); 
    $response->setHeaders(Request::fromString("Content-Type: application/octet-stream\r\nContent-Length: 9\r\nContent-Disposition: attachment; filename=\"ultimate_remedy_readme.txt\"")); 


} 

は今、私はこのエラーに

/var/www/whowantsmymoney/vendor/zendframework/zendframework/library/Zend/Http/Request.php:88 

メッセージを取得していますされますあなたは単純なファイルのダウンロードをします。

public function downloadAction() { 
    $fileName = 'somefile'; 

    if(!is_file($fileName)) { 
     //do something 
    } 

    $fileContents = file_get_contents($fileName); 

    $response = $this->getResponse(); 
    $response->setContent($fileContents); 

    $headers = $response->getHeaders(); 
    $headers->clearHeaders() 
     ->addHeaderLine('Content-Type', 'whatever your content type is') 
     ->addHeaderLine('Content-Disposition', 'attachment; filename="' . $fileName . '"') 
     ->addHeaderLine('Content-Length', strlen($fileContents)); 


    return $this->response; 
} 

鉱山があったように、私は、このコードを希望する多くの葉が、簡単な例で動作するはずです想像してみてください。私はどのようにあなたがチャンクでファイルを読むことを扱うかもしれないか分からない。多分誰かが光を放つことができるでしょうか?

編集 - 送信ストリーム

私は情報の目的のためにここにこれを追加しました。それはおそらくより少ないメモリを使用するようにダウンロードを強制するより良い方法です。

5

回答のために@Aydin Hassanに感謝しますが、いくつかの重要なヘッダーが彼の答えにありません。それに注意してください。

完全なヘッダーは、スタック:

public function downloadAction() { 
    $file = 'path/to/file'; 
    $response = new \Zend\Http\Response\Stream(); 
    $response->setStream(fopen($file, 'r')); 
    $response->setStatusCode(200); 
    $response->setStreamName(basename($file)); 
    $headers = new \Zend\Http\Headers(); 
    $headers->addHeaders(array(
     'Content-Disposition' => 'attachment; filename="' . basename($file) .'"', 
     'Content-Type' => 'application/octet-stream', 
     'Content-Length' => filesize($file), 
     'Expires' => '@0', // @0, because zf2 parses date as string to \DateTime() object 
     'Cache-Control' => 'must-revalidate', 
     'Pragma' => 'public' 
    )); 
    $response->setHeaders($headers); 
    return $response; 
} 
+0

合意。しかし、この質問は2年前に尋ねられ、その時のZF2の時間と成熟の必要性に従って、この質問と基本的な問題の解決された解決された多くの事実を考慮する必要があります –

+3

@ noobie- phpあなたはこの2年間HTTP仕様が変更されていないことを保証します。私はSOコミュニティのコンテンツを改善するために努力し、いくつかのヘッダーを追加しました。そのヘッダーは、ブラウザの実装に依存して最終的なキャッシュのダウンロードコンテンツを防止します。質問してくれてありがとう、その答えは(いくつかのより多くの研究の後に)私の問題をより早く解決させました。 – Athlan

関連する問題