2009-12-01 17 views
5

Podane: Wszystkie przesłane pliki PDF na serwerze są poprzedzone znacznikami czasu. Później użytkownik może ponownie pobrać te pliki. Te (brzydkie) nazwy plików nigdy więcej nie zmienią się na serwerze.Zmień nazwę pliku pdf do pobrania na bieżąco

Pytanie: Kiedy podaję opcję pobrania pliku PDF, nazwa pliku wygląda na brzydką i długotrwałą. Jak mogę zmienić tę nazwę na coś sensownego, tak, że gdy użytkownik pobierze ten plik, nazwa nie będzie wyglądać dziwnie?

Czy muszę wykonać kopię, ponieważ zmiana nazwy oryginalnego pliku nie jest możliwa? Czy nie byłoby dodatkowe obciążenie dla każdego pliku do pobrania? Oczywiście usunięcie skopiowanego pliku byłoby kolejnym dodatkowym krokiem?

Czy można zmienić nazwę pliku po całkowitym pobraniu pliku po stronie klienta?

Co proponujesz?

Odpowiedz

10

coś takiego:

<?php 
// We'll be outputting a PDF 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 
+0

'Content-type' powinno być' Content-Type' , chociaż. – jensgram

+0

@jensgram: nie jest rozróżniana wielkość liter. – BalusC

+0

@klausbyskov: patrz komentarz poniżej BalusC. według niego to nie zadziała na IE? – understack

0

Nazwa pliku zawartości serwowane jest zdefiniowana w nagłówkach HTTP. Rozejrzyj się wokół PHP page on headers (także komentarzy), aby uzyskać więcej informacji.

1

trzeba ustawić żądaną nazwę pliku w nagłówku Content-Disposition:

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

Ale niestety to nie zostanie odebrany przez pewnego przeglądarce internetowej opracowanej przez zespół w Redmond. Jeśli chcesz, aby działało również w tej przeglądarce, musisz dołączyć tę samą nazwę pliku, co ostatnia część ścieżki żądania. Na przykład: http://example.com/pdf/desiredname.pdf.

+0

Myślę, że technicznie parametr nazwy pliku nie powinien być w cudzysłowach.Jeśli nazwa nie zawiera spacji ani zabawnych znaków, nie umieszczaj jej w cudzysłowach. – TRiG

+0

@BalusC: to było pomocne, takie jak http://stackoverflow.com/questions/698308/why-doesnt-content-disposition-header-work-in-ie-8 this. Dzięki. – understack

0

Robiłem coś podobnego jakiś czas temu, serwując pliki za pośrednictwem php (w moim przypadku, nie zmieniając ich nazwy, ale aby sprawdzić, czy osoba pobierająca je była zalogowana i mogła zobaczyć te pliki). Okazało się, że pliki do pobrania pdf nie działa w IE chyba dodałam również te nagłówki:

header('Pragma: public'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Transfer-Encoding: binary'); 

nie jestem pewien dlaczego. Eksperymentuj i zobacz, co się stanie.

6

Potrzebowałem zrobić to dla niedawnego projektu i byłem nieco zdezorientowany, jak go wdrożyć, ale doszedłem do wniosku wkrótce po zobaczeniu odpowiedzi Klausa. Aby dalej rozwinąć odpowiedź Klausa:

1) Utwórz plik o nazwie, np. "Process.php". Zmodyfikuj kod Klausa, aby akceptował dwa parametry: oryginalną nazwę pliku i nową nazwę. Moja process.php wygląda następująco:

<?php 
$file = $_GET['file']; 
if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/pdf'); 
    header('Content-Disposition: attachment; filename='.$_GET['newFile']); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 
?> 

2) Utwórz link na swojej stronie użytkownika elewacyjnej, który wskazuje na skrypcie Procesor:

<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a> 
+0

Jeśli mój plik znajduje się w katalogu "myFiles", jak mogę ustawić tutaj ścieżkę? Jestem trochę zdezorientowany. Możesz mi wytłumaczyć? –

+0

Znalazłem to. Przypisałem nazwę pliku jako '$ file = 'myFiles/sample.pdf';'. Działa jak urok ... Dzięki za kod ... +1 –