Czy istnieje sposób na wymuszenie otwierania plików PDF w przeglądarce, gdy nie jest zaznaczona opcja „Wyświetlaj PDF w przeglądarce”?
Próbowałem użyć tagu embed i iframe, ale działa to tylko wtedy, gdy ta opcja jest zaznaczona.
Co mogę zrobić?
Czy istnieje sposób na wymuszenie otwierania plików PDF w przeglądarce, gdy nie jest zaznaczona opcja „Wyświetlaj PDF w przeglądarce”?
Próbowałem użyć tagu embed i iframe, ale działa to tylko wtedy, gdy ta opcja jest zaznaczona.
Co mogę zrobić?
Odpowiedzi:
Aby wskazać przeglądarce, że plik powinien być przeglądany w przeglądarce, odpowiedź HTTP powinna zawierać następujące nagłówki:
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Aby pobrać plik zamiast go obejrzeć:
Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"
Cudzysłowy wokół nazwy pliku są wymagane, jeśli nazwa pliku zawiera znaki specjalne, takie, filename[1].pdf
które w przeciwnym razie mogłyby zakłócić zdolność przeglądarki do obsługi odpowiedzi.
Sposób ustawienia nagłówków odpowiedzi HTTP będzie zależeć od serwera HTTP (lub, jeśli generujesz odpowiedź PDF z kodu po stronie serwera: twój język programowania po stronie serwera).
Jeśli używasz HTML5 (i myślę, że obecnie wszyscy go używają), istnieje atrybut o nazwie download
.
Na przykład,
<a href="somepathto.pdf" download="filename">
Tutaj filename
nie jest obowiązkowe, ale jeżeli jest, to zajmie to nazwę pobranego pliku.
Prawidłowy typ dotyczy application/pdf
pliku PDF, a nie application/force-download
. To wygląda jak włamanie do niektórych starszych przeglądarek. Zawsze używaj prawidłowego typu mimet, jeśli możesz.
Jeśli masz kontrolę nad kodem serwera:
header("Content-Disposition", "attachment; filename=myfilename.myextension");
header("Content-Disposition", "inline; filename=myfilename.myextension");
Brak kontroli nad kodem serwera:
UWAGA: Wolę ustawić nazwę pliku po stronie serwera, ponieważ możesz mieć więcej informacji i używać wspólnego kodu.
Jeśli masz Apache, dodaj to do .htaccess
pliku:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Ups, w moim poprzednim poście wystąpiły błędy pisowni.
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
Jeśli nie chcesz, aby przeglądarka pytała użytkownika, użyj „inline” dla trzeciego ciągu zamiast „załącznika”. Inline działa bardzo dobrze. Plik PDF zostanie wyświetlony natychmiast, bez pytania użytkownika o kliknięcie Otwórz. Użyłem „załącznika”, a to poprosi użytkownika o otwarcie, zapisz. Próbowałem zmienić nakrętkę ustawienia przeglądarki, co nie zapobiega wyświetlaniu monitu.
To jest dla ASP.NET MVC
Na twojej stronie cshtml:
<section>
<h4><a href="@Url.Action("Download", "Document", new { id = @Model.GUID })"><i class="fa fa-download"></i> @Model.Name</a></h4>
<object data="@Url.Action("View", "Document", new { id = @Model.GUID })" type="application/pdf" width="100%" height="800" class="col-md-12">
<h2>Your browser does not support viewing PDFs, click on the link above to download the document.</h2>
</object>
</section>
W twoim kontrolerze:
public ActionResult Download(Guid id)
{
if (id == Guid.Empty)
return null;
var model = GetModel(id);
return File(model.FilePath, "application/pdf", model.FileName);
}
public FileStreamResult View(Guid id)
{
if (id == Guid.Empty)
return null;
var model = GetModel(id);
FileStream fs = new FileStream(model.FilePath, FileMode.Open, FileAccess.Read);
return File(fs, "application/pdf");
}
Podczas gdy poniższe działa dobrze na Firefox, NIE działa na przeglądarkach Chrome i mobilnych.
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Aby naprawić błąd przeglądarki Chrome i przeglądarki mobilnej, wykonaj następujące czynności:
Przeglądarka Google PDF może być używana w następujący sposób:
<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>
Otwórz downloads.php z pliku root.
Następnie przejdź do linii 186 i zmień ją na:
if(preg_match("/\.jpg|\.gif|\.png|\.jpeg/i", $name)){
$mime = getimagesize($download_location);
if(!empty($mime)) {
header("Content-Type: {$mime['mime']}");
}
}
elseif(preg_match("/\.pdf/i", $name)){
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
}
else{
header("Content-Type: application/force-download");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$name."\";");
}
Możesz to zrobić w następujący sposób:
<a href="path to PDF file">Open PDF</a>
Jeśli plik PDF znajduje się w jakimś folderze i ten folder nie ma uprawnień do bezpośredniego dostępu do plików w tym folderze, musisz ominąć niektóre ograniczenia dostępu do .htaccess
plików przy użyciu ustawień pliku w ten sposób:
<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
Order Allow,Deny
Allow from all
</FilesMatch>
Ale teraz zezwól tylko na niektóre niezbędne pliki.
Użyłem tego kodu i działał idealnie.
Albo użyj
<embed src="file.pdf" />
jeśli osadzanie jest opcją lub moją nową wtyczką, PIFF: https://github.com/terrasoftlabs/piff
Oto kolejna metoda wymuszenia wyświetlenia pliku w przeglądarce w PHP:
$extension = pathinfo($file_name, PATHINFO_EXTENSION);
$url = 'uploads/'.$file_name;
echo '<html>'
.header('Content-Type: application/'.$extension).'<br>'
.header('Content-Disposition: inline; filename="'.$file_name.'"').'<br>'
.'<body>'
.'<object style="overflow: hidden; height: 100%;
width: 100%; position: absolute;" height="100%" width="100%" data="'.$url.'" type="application/'.$extension.'">
<embed src="'.$url.'" type="application/'.$extension.'" />
</object>'
.'</body>'
. '</html>';
header
nie działa po rozpoczęciu wypisywania treści żądania (i nie zwraca ciągu do konkatenacji w dokumencie HTML)
Wystarczy otworzyć Adobe Reader, menu → Edytuj → Preferencje → Internet , a następnie przejść do trybu przeglądarki lub uzyskać szczegółowe instrukcje w różnych przeglądarkach. Spróbuj wyświetlić PDF w przeglądarce | Acrobat, Acrobat Reader .
Jeśli link do pliku .PDF otworzy się w przeglądarce.
Jeśli pole nie jest zaznaczone, powinno zawierać link do pliku .zip, aby wymusić pobranie.
Jeśli .zip nie jest opcją, użyj nagłówków w PHP, aby wymusić pobieranie
header('Content-Type: application/force-download');
header('Content-Description: File Transfer');