2013-04-08 33 views
5

Tôi gặp phải một vấn đề mà tôi đang cố gắng giải quyết trong hơn hai ngày nay: Tôi đã xây dựng một Website bằng cách sử dụng CakePHP và mọi thứ đều hoạt động tốt nhưng tôi gặp khó khăn khi cố gắng thực hiện tải xuống liên kết đến các tệp được lưu trữ dưới APP_DIR/someFolder/someFile.zip.cakephp file download link

Làm cách nào để đặt liên kết tải xuống tệp trong someFolder? Tôi thường tình cờ gặp "Chế độ xem phương tiện" Tôi đã thử triển khai chúng nhưng cho đến nay tôi đã không thành công.

Bên cạnh đó không có cách nào dễ dàng hơn để làm cho tệp có thể tải xuống được?

+0

Nếu bạn đang sử dụng Apache, bạn có thể buộc tải về bằng cách thêm một '.htaccess' bên trong thư mục 'tải'. Xem một số ví dụ tại đây: http://www.givegoodweb.com/post/30/forcing-a-download-with-apache-and-htaccess và http://www.timewasters-place.com/how-to-force -file-download-with-htaccess/Bằng cách này bạn không cần phải phục vụ các tập tin để tải về thông qua PHP – thaJeztah

+0

Điều gì về việc đặt chúng tại APP_DIR/webroot/someFolder /? – SaidbakR

+0

@ sємsєм Bạn nói đúng (không nhận thấy các tập tin không nằm trong webroot). Mặc dù chỉ đặt chúng trong một thư mục công khai sẽ không tự động buộc chúng tải xuống (ví dụ: nếu tệp là JPG). Thêm một .htaccess gửi tiêu đề 'tải xuống', sẽ giúp mọi người dễ dàng 'tải xuống' các tệp thay vì * xem * chúng bên trong trình duyệt. Mặc dù nó có thể làm như vậy xem PHP (xem câu trả lời dưới đây), điều này không phải luôn luôn lý tưởng, đặc biệt là cho các tập tin lớn. – thaJeztah

Trả lời

15

Chế độ xem phương tiện bị ngừng sử dụng kể từ phiên bản 2.3. Bạn nên sử dụng Sending files để thay thế.

Check-out dụ tối thiểu này trong điều khiển của bạn:

public function download($id) { 
    $path = $this->YourModel->aMagicFunctionThatReturnsThePathToYourFile($id); 
    $this->response->file($path, array(
     'download' => true, 
     'name' => 'the name of the file as it should appear on the client\'s computer', 
    )); 
    return $this->response; 
} 

Tham số đầu tiên của $this->response->file là tương đối so với thư mục APP của bạn. Vì vậy, gọi số $this->response->file('someFolder' . DS . 'someFile.zip') sẽ tải xuống tệp APP/someFolder/someFile.zip.

"Gửi tệp" yêu cầu ít nhất CakePHP phiên bản 2.0. Ngoài ra, hãy xem xét xem liên kết Cookbook ở trên.


Nếu bạn đang chạy một phiên bản cũ của CakePHP bạn nên sử dụng Truyền thông xem như bạn đã đề cập trong câu hỏi của bạn. Sử dụng mã này và tham khảo Media Views (Cookbook).

Dưới đây là các phương pháp tương tự cho các phiên bản cũ:

public function download($id) { 
    $this->viewClass = 'Media'; 
    $path = $this->YourModel->aMagicFunctionThatReturnsThePathToYourFile($id); 
    // in this example $path should hold the filename but a trailing slash 
    $params = array(
     'id' => 'someFile.zip', 
     'name' => 'the name of the file as it should appear on the client\'s computer', 
     'download' => true, 
     'extension' => 'zip', 
     'path' => $path 
    ); 
    $this->set($params); 
} 
+0

hmm ... Tôi đã thực hiện nó theo cách bạn mô tả nhưng tôi đang gettiing: Gọi đến phương thức chưa xác định CakeResponse :: files() ... Tôi đã đặt nó vào Tài liệu và không thể tìm thấy phương thức tệp() nhưng id đã tìm thấy một phương pháp tải về nhưng tôi không thể làm cho nó hoạt động với Ether .. :( –

+0

@ sємsєм: Tôi muốn giữ bên ngoài Webroot Nếu có thể ... Nó không phải là dữ liệu senetive Nhưng tôi sẽ cảm thấy tốt hơn nếu các tập tin Arent ở đó cho thế giới wole để Grab sao chép và chơi arround Với ... –

+0

@MichaelHofmair: phiên bản CakePHP nào bạn sử dụng? Như đã đề cập trong câu trả lời của tôi, bạn cần ít nhất CakePHP phiên bản 2.0. Nhưng tôi đã chỉnh sửa câu trả lời và thêm giải thích cho các phiên bản cũ hơn – Jan