2013-03-05 16 views
17

ZF2 kullanarak zorlamak için çalışıyorum. İşte ben bu hatayı alıyorumforce download ZF2 kullanarak

şimdi
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\"")); 


} 

benim koduna pasajıdır

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

Mesaj:

A valid request line was not found in the provided string 

Yığın izleme:

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

yerine yeni bir istek nesnesi nesnelleştirilme varolan yanıt alacaksınız. $ This-> getResponse(); Başlıkları belirledikten sonra cevabı geri vermelisiniz. –

+0

mevcut üstbilgileri kullanmamanın tek nedeni, mevcut başlıkların istediğim içeriği içermemesiydi, böylece yeni oluşturmam gerekti. –

cevap

36

Bu kod yardımcı olmalıdır Basit bir dosya indirme için. benimdi olarak

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; 
} 

Ben, bu kod arzulanan bir şey bırakır hayal ama basit durumlarda çalışmalıdır. Dosyayı yığınlarda okumayı nasıl başaracağınızdan emin değilim. Belki başka biri biraz ışık tutabilir mi?

Düzenleme - Gönderme akışları

ben bilgilendirme amaçlı burada bu ekledik. Muhtemelen daha az bellek kullanacağından indirme işlemlerini zorlamak daha iyi bir yoldur.

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

    $response = new \Zend\Http\Response\Stream(); 
    $response->setStream(fopen($fileName, 'r')); 
    $response->setStatusCode(200); 

    $headers = new \Zend\Http\Headers(); 
    $headers->addHeaderLine('Content-Type', 'whatever your content type is') 
      ->addHeaderLine('Content-Disposition', 'attachment; filename="' . $fileName . '"') 
      ->addHeaderLine('Content-Length', filesize($fileName)); 

    $response->setHeaders($headers); 
    return $response; 
5

Yanıt için @Aydin Hassan'a teşekkürler, ancak cevabında birkaç önemli başlık eksik. Buna dikkat et.

Tam başlıklarda yığını:

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

Anlaştık.Ama bu sorunun yaklaşık 2 yıl önce sorulduğu ve ZF2'nin o zamana ve olgunluğa olan ihtiyaca göre, bu soru ve cevaplarının temel düzey problemlerin çözüldüğü bir konu olduğu gerçeğini göz önünde bulundurmalısınız –

+3

@ noobie- php Garantim var, bu 2 yıl boyunca HTTP spesifikasyonu değişmedi. SO topluluk içeriğini geliştirmeye çalışıyorum ve bazı başlıklar ekledim. Bu headrs, içeriği indirmenin nihai önbelleğini önler, tarayıcının uygulamasına bağlıdır. Sorulan soru için teşekkürler, bunun cevabı (daha fazla araştırmadan sonra) sorunumun daha hızlı çözülmesini sağladı. – Athlan