"PDF'yi tarayıcıda görüntüle" seçeneği işaretlenmediğinde PDF dosyalarını tarayıcıda açmaya zorlamanın bir yolu var mı?
Gömme etiketini ve bir iframe'i kullanmayı denedim, ancak yalnızca bu seçenek işaretlendiğinde çalışır.
Ne yapabilirim?
"PDF'yi tarayıcıda görüntüle" seçeneği işaretlenmediğinde PDF dosyalarını tarayıcıda açmaya zorlamanın bir yolu var mı?
Gömme etiketini ve bir iframe'i kullanmayı denedim, ancak yalnızca bu seçenek işaretlendiğinde çalışır.
Ne yapabilirim?
Yanıtlar:
Tarayıcıya dosyanın tarayıcıda görüntülenmesi gerektiğini belirtmek için HTTP yanıtı şu başlıkları içermelidir:
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Dosyanın görüntülenmek yerine indirilmesi için :
Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"
Dosya adı filename[1].pdf
, tarayıcının yanıtı yanıtlama yeteneğini bozabilecek gibi özel karakterler içeriyorsa, dosya adının etrafındaki tırnak işaretleri gerekir .
HTTP yanıt başlıklarını nasıl ayarlayacağınız, HTTP sunucunuza bağlıdır (veya sunucu yanıtı kodundan PDF yanıtı oluşturuyorsanız: sunucu tarafı programlama diliniz).
HTML5 kullanıyorsanız (ve sanırım bugünlerde herkes bunu kullanıyor), adlı bir özellik var download
.
Örneğin,
<a href="somepathto.pdf" download="filename">
Burada filename
isteğe bağlıdır, ancak belirtilirse indirilen dosya için bu adı alır.
Doğru tür application/pdf
PDF içindir, değil application/force-download
. Bu, bazı eski tarayıcılar için bir saldırı gibi görünüyor. Mümkünse her zaman doğru mime türünü kullanın.
Sunucu kodu üzerinde kontrolünüz varsa:
header("Content-Disposition", "attachment; filename=myfilename.myextension");
header("Content-Disposition", "inline; filename=myfilename.myextension");
Sunucu kodu üzerinde kontrol yok:
NOT: Daha fazla bilgi alabileceğiniz ve ortak kodu kullanabileceğiniz için dosya adını sunucu tarafında ayarlamayı tercih ederim.
Apache'niz varsa bunu .htaccess
dosyaya ekleyin :
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Hata! Önceki yazımda yazım hataları vardı.
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
Tarayıcının kullanıcıdan sormasını istemiyorsanız, "ek" yerine üçüncü dize için "satır içi" seçeneğini kullanın. Satır içi çok iyi çalışıyor. PDF, kullanıcıdan Aç'ı tıklatmasını istemeden hemen görüntülenir. Ben "ek" kullandım ve bu kullanıcı Aç, Kaydet için isteyecektir. Tarayıcı ayar somununu değiştirmeye çalıştım, istemi engellemiyor.
Bu ASP.NET MVC içindir
Cshtml sayfanızda:
<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>
Kumandanızda:
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");
}
Aşağıdakiler firefox'ta iyi çalışır, ancak krom ve mobil tarayıcılarda ÇALIŞMAZ.
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Chrome ve mobil tarayıcılar hatasını düzeltmek için aşağıdakileri yapın:
Google PDF Görüntüleyici şu şekilde kullanılabilir:
<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>
Rootfile'dan downloads.php dosyasını açın.
Ardından 186 numaralı satıra gidin ve şu şekilde değiştirin:
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."\";");
}
Bunu aşağıdaki şekilde yapabilirsiniz:
<a href="path to PDF file">Open PDF</a>
PDF dosyası bir klasörün içindeyse ve bu klasörün o klasördeki dosyalara doğrudan erişim izni yoksa, .htaccess
dosya ayarını bu şekilde kullanarak bazı dosya erişim kısıtlamalarını atlamanız gerekir :
<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
Order Allow,Deny
Allow from all
</FilesMatch>
Ama şimdi sadece bazı gerekli dosyalara izin verin .
Bu kodu kullandım ve mükemmel çalıştı.
Ya kullanın
<embed src="file.pdf" />
yerleştirme bir seçenek veya yeni eklentim ise, PIFF: https://github.com/terrasoftlabs/piff
PHP'de bir dosyayı tarayıcıda görüntülemeye zorlamanın başka bir yöntemi:
$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
istek gövdesini çıkarmaya başladıktan sonra çalışmaz (ve bir HTML belgesinde birleştirmek için bir dize döndürmez)
Adobe Reader'ı açın, menü → Düzenle → Tercihler → İnternet'i seçin , ardından tarayıcı moduna geçin veya farklı tarayıcılarla ilgili ayrıntılı talimatlar için PDF'yi tarayıcıda görüntüle | Acrobat, Acrobat Reader .
Bir .PDF'ye bağlanırsanız, tarayıcıda açılır.
Kutu işaretli değilse, indirmeyi zorlamak için bir .zip dosyasına bağlanmalıdır.
Bir .zip seçeneği yoksa , indirmeyi zorlamak için PHP'deki başlıkları kullanın
header('Content-Type: application/force-download');
header('Content-Description: File Transfer');