2011-03-07 33 views
6

Tôi đã tạo một hành động đơn giản trong symfony tạo tệp PDF qua wkhtmltopdf và xuất ra trình duyệt.symfony: setHttpHeader() không hoạt động, header() không

Dưới đây là các mã:

$response = $this->getResponse(); 
    $response->setContentType('application/pdf'); 
    $response->setHttpHeader('Content-Disposition', "attachment; filename=filename.pdf"); 
    $response->setHttpHeader('Content-Length', filesize($file)); 
    $response->sendHttpHeaders(); 
    $response->setContent(file_get_contents($file)); 
    return sfView::NONE; 

Đó hoạt động tốt trong môi trường phát triển địa phương của tôi - trình duyệt của tôi được các tiêu đề như mong đợi, cho thấy việc tải xuống-đối thoại.

Bây giờ tôi đã cập nhật môi trường thử nghiệm của mình, chạy Apache 2.2.9-10 + lenny9 với PHP 5.3.5-0.dotdeb.0. Nếu tôi gọi đó là URL bây giờ cho việc thử nghiệm-môi trường, trình duyệt của tôi không nhận được bất kỳ tùy chỉnh thiết lập tiêu đề:

Date Mon, 07 Mar 2011 10:34:37 GMT 
Server Apache 
Keep-Alive timeout=15, max=100 
Connection Keep-Alive 
Transfer-Encoding chunked 

Nếu tôi đặt chúng bằng tay thông qua tiêu đề() trong hành động của tôi, Firebug cho thấy các tiêu đề như mong đợi . Có ai biết điều gì có thể sai không? Có phải đó là một lỗi symfony, hoặc một vấn đề cấu hình php hoặc apache2? Tôi không hiểu. : -/

Cảm ơn trước!

+0

@teonanacatl ... Chọn một trong các tài khoản của bạn và sử dụng nó Hiện tại bạn đang sử dụng rõ ràng hai tài khoản khác nhau http:..//stackoverflow.com/users/647993/teonanacatl và http://stackoverflow.com/users/480353/teonanacatl –

Trả lời

10

Vấn đề của bạn là ở đây:

return sfView::NONE; 

Thay đổi này để:

return sfView::HEADERS_ONLY; 

chỉnh sửa cập nhật do bình luận thêm .

Vì bạn đang cố gắng tải xuống bản pdf, bạn đang gặp sự cố không chính xác. Không sử dụng sendContent(). Xem bên dưới (đây là đoạn trích từ trang web sản xuất tôi đã viết và đã được chứng minh là hoạt động trên tất cả các trình duyệt chính):

$file = '/path/to/file.pdf'; 
$this->getResponse()->clearHttpHeaders(); 
$this->getResponse()->setStatusCode(200); 
$this->getResponse()->setContentType('application/pdf'); 
$this->getResponse()->setHttpHeader('Pragma', 'public'); //optional cache header 
$this->getResponse()->setHttpHeader('Expires', 0); //optional cache header 
$this->getResponse()->setHttpHeader('Content-Disposition', "attachment; filename=myfile.pdf"); 
$this->getResponse()->setHttpHeader('Content-Transfer-Encoding', 'binary'); 
$this->getResponse()->setHttpHeader('Content-Length', filesize($file)); 

return $this->renderText(file_get_contents($file)); 
+1

HEADER_ONLY, không HEADERS_ONLY –

+0

Điều này sẽ không hiệu quả đối với tôi mà không thêm $ this-> getResponse() -> sendHttpHeaders (); – Jestep

0

Sự khác biệt duy nhất mà tôi có là:

$response = $this->getContext()->getResponse(); 
$response->clearHttpHeaders(); 
0

Có cùng vấn đề. Chỉ cần thêm dấu ngoặc kép (") xung quanh filename

$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename="'.$filename.'"'); 

hoặc

header('Content-Disposition: attachment; filename="'.$filename.'"');