Jak zrobić plik PDF do pobrania w HTML link?

Podaję link do pliku pdf na mojej stronie do pobrania, jak poniżej

<a href="myfile.pdf">Download Brochure</a>

Problem polega na tym, że gdy użytkownik kliknie ten link to

  • Jeśli Użytkownik ma zainstalowany program Adobe Acrobat, otwiera plik w tym samym oknie przeglądarki w programie Adobe Reader.
  • Jeśli Adobe Acrobat nie jest zainstalowany, to wyskakuje do użytkownika w celu pobrania pliku.

Ale chcę, aby zawsze wyskakiwał do użytkownika do pobrania, niezależnie od" Adobe acrobat " jest zainstalowany lub nie.

Proszę, powiedz mi, Jak mogę to zrobić?
Author: Rob W, 2008-12-13

12 answers

Zamiast linkowania do .Plik PDF, zamiast tego zrób coś w stylu

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

Który wyświetla niestandardowy nagłówek, otwiera plik PDF (binary safe) i drukuje DANE do przeglądarki użytkownika, a następnie może wybrać zapisanie pliku PDF pomimo ustawień przeglądarki. Pdf_server.php powinno wyglądać tak:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp); 

PS: i oczywiście Uruchom kilka sprawdzeń rozsądku w zmiennej "file", aby zapobiec kradzieży plików, takich jak nie Akceptuj rozszerzeń plików, Odrzuć ukośniki, dodaj .pdf do wartość

 109
Author: TravisO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 18:27:02

Jest to częsty problem, ale niewiele osób wie, że istnieje proste rozwiązanie HTML 5:

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>

Gdzie {[2] } jest sugerowaną nazwą pliku dla użytkownika do zapisania pliku. Lub domyślna nazwa pliku na serwerze, jeśli zostawisz ją pustą, w następujący sposób:

<a href="./directory/yourfile.pdf" download>Download the pdf</a>

Kompatybilność: testowałem to na Firefoksie 21 i żelazku, oba działały dobrze. Może nie działać w przeglądarkach niezgodnych z HTML5 lub przestarzałych. Jedyną przeglądarką, którą testowałem, która nie wymusza pobierania jest IE...

Sprawdź zgodność tutaj: http://caniuse.com/#feat=download

 161
Author: T_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-02 15:37:34

Nie pętla przez każdą linię pliku. Użyj readfile zamiast tego, jest szybszy. To jest poza stroną php: http://php.net/manual/en/function.readfile.php

$file = $_GET["file"];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));
    // header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

Upewnij się, że dezaktywujesz zmienną get, ponieważ ktoś może pobrać kilka plików php...

 45
Author: Alex V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 13:35:59

Zamiast używać skryptu PHP, aby odczytać i spłukać plik, lepiej jest przepisać nagłówek za pomocą .htaccess. Spowoduje to zachowanie "ładnego" adresu URL (myfile.pdf zamiast download.php?myfile).

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
 23
Author: Rob W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-26 09:16:24

Znalazłem sposób, aby to zrobić za pomocą zwykłego starego HTML i JavaScript / jQuery, które degradują wdzięcznie. Testowane w IE7-10, Safari, Chrome i FF:

HTML do pobrania link:

<p>Thanks for downloading! If your download doesn't start shortly, 
<a id="downloadLink" href="...yourpdf.pdf" target="_blank" 
type="application/octet-stream" download="yourpdf.pdf">click here</a>.</p>

JQuery (czysty kod JavaScript byłby bardziej wyrazisty), który symuluje klikanie w link po małym opóźnieniu:

var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);

Aby uczynić to bardziej wytrzymałym, możesz dodać wykrywanie funkcji HTML5, a jeśli jej nie ma, Użyj window.open(), aby otworzyć nowe okno z plikiem.

 14
Author: Alex W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-20 20:58:26

To jest klucz:

header("Content-Type: application/octet-stream");

Content-type application / x-pdf-document lub application/pdf jest wysyłany podczas wysyłania pliku PDF. Program Adobe Reader zazwyczaj ustawia obsługę tego typu MIME, aby przeglądarka przekazywała dokument do programu Adobe Reader po otrzymaniu dowolnego z typów MIME PDF.

 5
Author: Sudden Def,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-13 07:27:19

Jest łatwiejszy sposób w HTML5: Dodaj atrybut Download.

Jest obsługiwany przez większość nowoczesnych przeglądarek.

<a download href="file.pdf">Download PDF</a> 
 4
Author: tawsif torabi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-05 05:52:29

Wiem, że jestem bardzo późno, aby odpowiedzieć na to, ale znalazłem hack to zrobić w javascript.

function downloadFile(src){
    var link=document.createElement('a');
    document.body.appendChild(link);
    link.href= src;
    link.download = '';
    link.click();
}
 2
Author: Shivek Parmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 18:48:24

Spróbuj tego:

<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>

Kod w pdf_server_with_path.php to:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
$path = $_GET["path"];
$fullfile = $path.$file;

header("Content-Disposition: attachment; filename=" . Urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . Filesize($fullfile));
flush(); // this doesn't really matter.
$fp = fopen($fullfile, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);
 0
Author: Saill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-19 22:14:50

Oto inne podejście. Wolę zamiast polegać na obsłudze przeglądarki, lub zająć się tym w warstwie aplikacji, używać logiki serwera www.

Jeśli używasz Apache, i można umieścić an .plik htaccess w odpowiednim katalogu możesz użyć poniższego kodu. Oczywiście możesz umieścić to w httpd.conf jak również, jeśli masz dostęp do tego.

<FilesMatch "\.(?i:pdf)$">
  Header set Content-Disposition attachment
</FilesMatch>

Dyrektywa FilesMatch jest tylko wyrażeniem regularnym, więc może być ustawiona tak szczegółowo, jak chcesz, lub możesz dodać inne rozszerzenia.

Linia nagłówka robi to samo, co pierwsza linia w skryptach PHP powyżej. Jeśli chcesz również ustawić wiersze typu treści, możesz to zrobić w ten sam sposób, ale nie uznałem tego za konieczne.

 0
Author: Evan Donovan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-29 16:52:53

Mój rozwiązałem używając całego adresu url pliku PDF (zamiast po prostu umieszczać nazwę pliku lub lokalizację w href): a href= " domena . com / pdf / nazwa pliku.pdf "

 0
Author: Mark Allena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 11:05:41

W aplikacji Ruby on Rails (szczególnie z czymś takim jak Krewn gem i wtyczka Prawnto Rails), możesz to osiągnąć nieco bardziej prosto niż pełny skrypt (jak w poprzednim przykładzie PHP).

W Twoim kontrolerze:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

Część render :layout => false mówi przeglądarce, aby otworzyła " czy chcesz pobrać ten plik?"prompt zamiast próby renderowania pliku PDF. Wtedy będziesz mógł normalnie połączyć się z plikiem: http://mysite.com/myawesomepdf.pdf

 -1
Author: btw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-13 07:49:25