2013-04-08 19 views
5

Znalazłem problem, który próbuję rozwiązać przez ponad dwa dni: Zbudowałem stronę internetową za pomocą cakephp i wszystko działa dobrze, ale utknąłem kiedy próbowałem zaimplementować pobieranie linki do plików przechowywanych pod APP_DIR/someFolder/someFile.zip.Pobierz plik cakephp link

Jak ustawić linki pobierania do plików wewnątrz someFolder? Często natknąłem się na "Media Views", próbowałem je realizować, ale jak dotąd nie udało mi się.

Poza tym nie ma prostszego sposobu na pobieranie plików?

+0

Jeśli używasz Apache, można wymusić pobieranie przez dodanie '.htaccess' wewnątrz katalogu„Pobierz”. Zobacz przykłady: http://www.givegoodweb.com/post/30/forcing-a-download-with-apache-and-htaccess i http://www.timewasters-place.com/how-to-force -file-pobieranie-z-htaccess/W ten sposób nie musisz podawać plików do pobrania przez PHP – thaJeztah

+0

Co powiesz na umieszczenie ich w APP_DIR/webroot/someFolder /? – SaidbakR

+0

@ sємsєм Masz rację (nie zauważyłem, że pliki nie znajdowały się wewnątrz webroota). Chociaż umieszczenie ich tylko w publicznym katalogu nie spowoduje automatycznie ich pobrania (np. Jeśli plik jest plikiem JPG). Dodanie pliku .htaccess, który wysyła nagłówki "download", ułatwi ludziom "pobieranie" plików zamiast * oglądania * ich w przeglądarce. Chociaż można to zrobić, przeglądając PHP (patrz odpowiedź poniżej), nie zawsze jest to idealne rozwiązanie, szczególnie w przypadku dużych plików. – thaJeztah

Odpowiedz

15

Widoki multimediów jest przestarzałe od wersji 2.3. Zamiast tego należy użyć Sending files.

Sprawdź ten minimalny przykład w kontrolerze:

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

Pierwszy parametr $this->response->file jest w stosunku do katalogu APP. Dlatego wywołanie $this->response->file('someFolder' . DS . 'someFile.zip') spowoduje pobranie pliku APP/someFolder/someFile.zip.

"Wysyłanie plików" wymaga co najmniej wersji CakePHP w wersji 2.0. Proszę również rozważyć spojrzenie na link Książka kucharska powyżej.


Jeśli używasz starszej wersji CakePHP należy użyć mediów Wyświetleń jak już wspomniano w swoim pytaniu. Użyj tego kodu i zapoznaj się z Media Views (Cookbook).

Oto ta sama metoda dla starszych wersjach:

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 ... Zaimplementowałem to tak, jak opisałeś, ale dostaję: Zadzwoń do niezdefiniowanej metody CakeResponse :: files() ... Przetasowałem ją w dokumentacji i nie mogłem znaleźć metody file() ale id znalazł metodę pobierania, ale nie mogę jej uruchomić z Ether ... :( –

+0

@ sємsєм: Chciałbym trzymać się poza Webroot, jeśli to możliwe ... To nie jest tajemnicze dane Ale czułbym się lepiej, gdyby te pliki Arent tam dla wole świata Grab skopiować i zagrać w arround Z ... –

+0

@MichaelHofmair: jakiej wersji CakePHP używasz? Jak wspomniano w mojej odpowiedzi potrzebujesz przynajmniej CakePHP wersji 2.0 Ale edytowałem moją odpowiedź i dodałem wyjaśnienia dla starszych wersji – Jan