มีวิธีบังคับให้เปิดไฟล์ PDF ในเบราว์เซอร์เมื่อไม่ได้เลือกตัวเลือก "แสดง PDF ในเบราว์เซอร์" หรือไม่?
ฉันลองใช้แท็กฝังและ iframe แต่ใช้ได้เฉพาะเมื่อตรวจสอบตัวเลือกนั้นแล้ว
ฉันควรทำอย่างไร
มีวิธีบังคับให้เปิดไฟล์ PDF ในเบราว์เซอร์เมื่อไม่ได้เลือกตัวเลือก "แสดง PDF ในเบราว์เซอร์" หรือไม่?
ฉันลองใช้แท็กฝังและ iframe แต่ใช้ได้เฉพาะเมื่อตรวจสอบตัวเลือกนั้นแล้ว
ฉันควรทำอย่างไร
คำตอบ:
หากต้องการระบุเบราว์เซอร์ที่ควรดูไฟล์ในเบราว์เซอร์การตอบสนอง HTTP ควรมีส่วนหัวเหล่านี้:
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
หากต้องการดาวน์โหลดไฟล์แทนที่จะดู:
Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"
จำเป็นต้องใช้อัญประกาศรอบชื่อไฟล์ถ้าชื่อไฟล์มีอักขระพิเศษเช่นfilename[1].pdf
ซึ่งอาจทำลายความสามารถของเบราว์เซอร์ในการจัดการการตอบสนอง
วิธีที่คุณตั้งค่าส่วนหัวการตอบกลับ HTTP จะขึ้นอยู่กับเซิร์ฟเวอร์ HTTP ของคุณ (หรือหากคุณกำลังสร้างการตอบกลับ PDF จากรหัสฝั่งเซิร์ฟเวอร์: ภาษาการเขียนโปรแกรมฝั่งเซิร์ฟเวอร์ของคุณ)
หากคุณกำลังใช้ HTML5 (และฉันเดาว่าทุกคนในปัจจุบันใช้มัน) มีคุณสมบัติที่เรียกว่า download
มีคุณลักษณะที่เรียกว่า
ตัวอย่างเช่น,
<a href="somepathto.pdf" download="filename">
ที่นี่filename
เป็นตัวเลือก แต่ถ้ามีจะใช้ชื่อนี้สำหรับไฟล์ที่ดาวน์โหลด
ประเภทที่ถูกต้องapplication/pdf
สำหรับ PDF ไม่ใช่application/force-download
ไม่ ดูเหมือนแฮ็คสำหรับเบราว์เซอร์รุ่นเก่าบางตัว ให้ใช้ชนิด mime ที่ถูกต้องทุกครั้งถ้าทำได้
หากคุณมีการควบคุมรหัสเซิร์ฟเวอร์:
header("Content-Disposition", "attachment; filename=myfilename.myextension");
header("Content-Disposition", "inline; filename=myfilename.myextension");
ไม่มีการควบคุมรหัสเซิร์ฟเวอร์:
หมายเหตุ: ฉันชอบการตั้งชื่อไฟล์ทางฝั่งเซิร์ฟเวอร์เนื่องจากคุณอาจมีข้อมูลเพิ่มเติมและสามารถใช้รหัสทั่วไปได้
หากคุณมี Apache เพิ่มสิ่งนี้ใน .htaccess
ไฟล์:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
อ๊ะเกิดข้อผิดพลาดในการพิมพ์ในโพสต์ก่อนหน้าของฉัน
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
หากคุณไม่ต้องการให้เบราว์เซอร์แจ้งผู้ใช้ให้ใช้ "อินไลน์" สำหรับสตริงที่สามแทน "ไฟล์แนบ" Inline ทำงานได้ดีมาก PDF จะแสดงทันทีโดยไม่ต้องให้ผู้ใช้คลิกที่ Open ฉันใช้ "ไฟล์แนบ" และสิ่งนี้จะแจ้งให้ผู้ใช้ทราบถึงการเปิด, บันทึก ฉันพยายามที่จะเปลี่ยนการตั้งค่าเบราว์เซอร์มันไม่ได้ป้องกันพรอมต์
นี่สำหรับ ASP.NET MVC
ในหน้า 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>
ในตัวควบคุมของคุณ:
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");
}
ในขณะที่ข้อมูลต่อไปนี้ทำงานได้ดีกับ Firefox แต่มันไม่สามารถทำงานได้ใน Chrome และเบราว์เซอร์มือถือ
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
หากต้องการแก้ไขข้อผิดพลาดของเบราว์เซอร์ Chrome & มือถือให้ทำดังนี้:
Google PDF Viewer สามารถใช้ได้ดังนี้:
<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>
เปิด downloads.php จาก rootfile
จากนั้นไปที่บรรทัด 186 และเปลี่ยนเป็นต่อไปนี้:
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."\";");
}
คุณสามารถทำได้ด้วยวิธีต่อไปนี้:
<a href="path to PDF file">Open PDF</a>
หากไฟล์ PDF อยู่ในโฟลเดอร์บางโฟลเดอร์และโฟลเดอร์นั้นไม่ได้รับอนุญาตให้เข้าถึงไฟล์ในโฟลเดอร์นั้นโดยตรงคุณต้องข้ามข้อ จำกัด การเข้าถึง.htaccess
ไฟล์โดยใช้การตั้งค่าไฟล์ด้วยวิธีนี้:
<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
Order Allow,Deny
Allow from all
</FilesMatch>
แต่ตอนนี้อนุญาตเพียงบางอย่างไฟล์ที่จำเป็น
ฉันใช้รหัสนี้และทำงานได้อย่างสมบูรณ์
ทั้งใช้
<embed src="file.pdf" />
หากการฝังเป็นตัวเลือกหรือปลั๊กอินใหม่ของฉัน PIFF: https://github.com/terrasoftlabs/piff
นี่เป็นอีกวิธีในการบังคับให้ไฟล์ดูในเบราว์เซอร์ใน 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
ไม่ทำงานหลังจากที่คุณเริ่มต้นการแสดงผลของร่างกายร้องขอ (และไม่กลับสตริงสำหรับเชื่อมโยงในเอกสาร HTML)
เพียงเปิด Adobe Reader เมนู→ แก้ไข →การตั้งค่า → อินเทอร์เน็ตจากนั้นเปลี่ยนเป็นโหมดเบราว์เซอร์หรือสำหรับคำแนะนำโดยละเอียดเกี่ยวกับเบราว์เซอร์ที่แตกต่างกันลองแสดง PDF ในเบราว์เซอร์ | Acrobat, Acrobat Reader
หากคุณลิงก์ไปยัง. PDF มันจะเปิดขึ้นในเบราว์เซอร์
หากไม่มีการทำเครื่องหมายในช่องควรลิงก์ไปยัง. zip เพื่อบังคับให้ดาวน์โหลด
หาก. zip ไม่ใช่ตัวเลือกให้ใช้ส่วนหัวใน PHP เพื่อบังคับการดาวน์โหลด
header('Content-Type: application/force-download');
header('Content-Description: File Transfer');