2013-03-05 34 views
17

Tôi đang cố gắng tải xuống lực bằng cách sử dụng ZF2. Dưới đây là đoạn mã của tôilực tải xuống bằng cách sử dụng ZF2

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


} 

bây giờ tôi đang nhận được lỗi này

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

nhắn:

A valid request line was not found in the provided string 

Stack trace:

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

Thay vì instantiating một đối tượng yêu cầu mới, bạn sẽ nhận được phản ứng hiện có. Hãy thử $ this-> getResponse(); sau khi bạn đã đặt tiêu đề, bạn nên trả lời câu trả lời. –

+0

lý do duy nhất mà tôi không sử dụng các tiêu đề hiện có là, các tiêu đề hiện tại không có nội dung mà tôi mong muốn vì vậy tôi phải tạo mới. –

Trả lời

36

Mã này sẽ giúp bạn tải xuống tệp đơn giản.

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

Tôi tưởng tượng mã này lá rất nhiều để được mong muốn, nhưng nên làm việc trong các trường hợp đơn giản, như là của tôi. Tôi không chắc chắn làm thế nào bạn có thể xử lý đọc các tập tin trong khối. Có lẽ ai đó khác có thể làm sáng tỏ?

Edit - Gửi suối

Tôi đã thêm ở đây cho mục đích thông tin. Nó có lẽ là cách tốt hơn để buộc tải xuống vì nó sẽ sử dụng ít bộ nhớ hơn nhiều.

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

Cảm ơn @Aydin Hassan đã trả lời nhưng một số tiêu đề quan trọng bị thiếu trong câu trả lời của anh ấy. Hãy cẩn thận về điều đó.

Tiêu đề đầy đủ ngăn xếp:

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

Đồng ý.Nhưng bạn nên xem xét thực tế, câu hỏi này được hỏi khoảng 2 năm trước và theo nhu cầu của thời gian và sự trưởng thành của ZF2 tại thời điểm đó, câu hỏi này và câu trả lời của nó được giải quyết rất nhiều vấn đề cấp cơ bản –

+3

@ noobie- php Bạn có đảm bảo của tôi, đặc tả HTTP đó không thay đổi trong 2 năm này. Tôi cố gắng cải thiện nội dung cộng đồng SO và thêm một số tiêu đề. Headrs đó ngăn chặn bộ nhớ đệm tải xuống nội dung cuối cùng, phụ thuộc vào việc triển khai của trình duyệt. Cảm ơn câu hỏi đã được đặt ra, câu trả lời cho điều đó (sau một vài nghiên cứu nữa) khiến vấn đề của tôi được giải quyết nhanh hơn. – Athlan

Các vấn đề liên quan