Có cách nào để buộc các tệp PDF mở trong trình duyệt khi tùy chọn "Hiển thị PDF trong trình duyệt" không được chọn không?
Tôi đã thử sử dụng thẻ nhúng và iframe, nhưng nó chỉ hoạt động khi tùy chọn đó được chọn.
Tôi có thể làm gì?
Có cách nào để buộc các tệp PDF mở trong trình duyệt khi tùy chọn "Hiển thị PDF trong trình duyệt" không được chọn không?
Tôi đã thử sử dụng thẻ nhúng và iframe, nhưng nó chỉ hoạt động khi tùy chọn đó được chọn.
Tôi có thể làm gì?
Câu trả lời:
Để cho trình duyệt biết rằng tệp nên được xem trong trình duyệt, phản hồi HTTP phải bao gồm các tiêu đề sau:
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Để tải tệp chứ không phải xem:
Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"
Các trích dẫn xung quanh tên tệp là bắt buộc nếu tên tệp chứa các ký tự đặc biệt như filename[1].pdf
có thể phá vỡ khả năng xử lý phản hồi của trình duyệt.
Cách bạn đặt các tiêu đề phản hồi HTTP sẽ phụ thuộc vào máy chủ HTTP của bạn (hoặc, nếu bạn đang tạo phản hồi PDF từ mã phía máy chủ: ngôn ngữ lập trình phía máy chủ của bạn).
Nếu bạn đang sử dụng HTML5 (và tôi đoán ngày nay mọi người đều sử dụng điều đó), có một thuộc tính được gọi download
.
Ví dụ,
<a href="somepathto.pdf" download="filename">
Đây filename
là tùy chọn, nhưng nếu được cung cấp, nó sẽ lấy tên này cho tệp đã tải xuống.
Loại chính xác là application/pdf
cho PDF, không phải application/force-download
. Điều này trông giống như một hack cho một số trình duyệt cũ. Luôn luôn sử dụng đúng mimetype nếu bạn có thể.
Nếu bạn có quyền kiểm soát mã máy chủ:
header("Content-Disposition", "attachment; filename=myfilename.myextension");
header("Content-Disposition", "inline; filename=myfilename.myextension");
Không kiểm soát mã máy chủ:
LƯU Ý: Tôi thích đặt tên tệp ở phía máy chủ vì bạn có thể có nhiều thông tin hơn và có thể sử dụng mã chung.
Nếu bạn có Apache, hãy thêm nó vào .htaccess
tệp:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Rất tiếc, đã có lỗi đánh máy trong bài viết trước của tôi.
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
Nếu bạn không muốn trình duyệt nhắc người dùng thì hãy sử dụng "nội tuyến" cho chuỗi thứ ba thay vì "tệp đính kèm". Inline hoạt động rất tốt. Màn hình PDF hiển thị ngay lập tức mà không yêu cầu người dùng nhấp vào Mở. Tôi đã sử dụng "tệp đính kèm" và điều này sẽ nhắc người dùng mở, lưu. Tôi đã cố gắng thay đổi cài đặt trình duyệt nhưng nó không ngăn được lời nhắc.
Cái này dành cho ASP.NET MVC
Trong trang cshtml của bạn:
<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>
Trong bộ điều khiển của bạn:
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");
}
Mặc dù các tính năng sau hoạt động tốt trên firefox, nhưng nó KHÔNG hoạt động trên các trình duyệt chrome và di động.
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Để khắc phục lỗi chrome & trình duyệt di động, hãy làm như sau:
Trình xem Google PDF có thể được sử dụng như vậy:
<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>
Mở download.php từ rootfile.
Sau đó đi đến dòng 186 và thay đổi nó như sau:
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."\";");
}
Bạn có thể làm điều này theo cách sau:
<a href="path to PDF file">Open PDF</a>
Nếu tệp PDF nằm trong một số thư mục và thư mục đó không có quyền truy cập trực tiếp vào các tệp trong thư mục đó thì bạn phải bỏ qua một số hạn chế truy cập .htaccess
tệp bằng cách sử dụng cài đặt tệp theo cách này:
<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
Order Allow,Deny
Allow from all
</FilesMatch>
Nhưng bây giờ cho phép chỉ định tập tin cần thiết.
Tôi đã sử dụng mã này và nó hoạt động hoàn hảo.
Hoặc là sử dụng
<embed src="file.pdf" />
nếu nhúng là một tùy chọn hoặc plugin mới của tôi, PIFF: https://github.com/terrasoftlabs/piff
Đây là một phương pháp khác để buộc một tệp phải xem trong trình duyệt trong 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
không hoạt động sau khi bạn bắt đầu xuất nội dung yêu cầu (và nó không trả về một chuỗi để nối trong tài liệu HTML)
Chỉ cần mở Adobe Reader, menu → Chỉnh sửa → Tùy chọn → Internet , sau đó thay đổi sang chế độ trình duyệt hoặc để được hướng dẫn chi tiết trên các trình duyệt khác nhau, hãy thử Hiển thị PDF trong trình duyệt | Acrobat, Acrobat Reader .
Nếu bạn liên kết đến .PDF, nó sẽ mở trong trình duyệt.
Nếu hộp được bỏ chọn, nó sẽ liên kết với .zip để buộc tải xuống.
Nếu .zip không phải là một tùy chọn, thì hãy sử dụng các tiêu đề trong PHP để buộc tải xuống
header('Content-Type: application/force-download');
header('Content-Description: File Transfer');