Dosyaları (PDF) indirmek yerine tarayıcıda nasıl açmaya zorlarım?


210

"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:


419

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).


13
İndirmeyi zorlamak için Content-Type: application / octet-stream kullanıyorum.
Papick G. Taboada

25
@ PapickG.Taboada ancak daha sonra kullanıcının sistemi dosya türünü bilmiyor olabilir. Örneğin bazı kullanıcılar PDF dosyaları için "Her zaman bu tür dosyaları aç" ı seçmiş olabilir. Belki de kullanıcının tercihlerini geçersiz kılmak istiyorsanız, octet-stream gitmek için bir yol olacaktır, ancak doğru türü ve önerilen bir dosya adını vermek, bir indirme sağlamanın "doğru" yoludur.
ColinM

2
hi @ColinM Burada biraz kafam karıştı ... pdf oluşturma sorunları yaşıyoruz, sadece şifreli metin veriyor. Content-Type: application / pdf Content-Disposition: inline; "filename.pdf"? çünkü, açısal-js kodunu kullanarak yüklüyoruz. Sorum şu: Yüklemeden önce içerik türü ayarlanmalı mı? Ayrıca, yalnızca arka uç ekibinden, dosya yolunu veren bir url, şu pencereyi kullanarak yeni sekmede açtığımız bir bağlantı alırız: window.open (url, '_blank'). Focus ();
Kailas

3
@Kailas Ne yapmaya çalıştığınızı anlamıyorum .. Cevap, bir sunucunun PDF dosyası için bir HTTP isteğine yanıt verirken istemciye göndermesi gereken başlıklara atıfta bulunmaktır. Bu üstbilgilerin bir dosya yüklemesi üzerinde hiçbir etkisi yoktur, url'nin arkasındaki kodu istemci tarafından her indirildiğinde üstbilgileri ayarlamanız gerekir.
ColinM

1
@ColinM Teşekkürler dostum, doğru söylediniz, hata ayıkladığımız zaman mime tipi dosyaları yüklerken belirlendi. Bu, arka uç ekip tarafından yapılmalıdır. Java komut dosyası üstbilgileri eklemek için kodları almaya çalıştım ama başarılı olmadı. Teşekkürler, gerçek fikri sizden temizledikçe ... :)
Kailas

19

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 filenameisteğe bağlıdır, ancak belirtilirse indirilen dosya için bu adı alır.


2
Sunucu kodu üzerinde denetiminiz varsa, aynı dosya adı oluşturma kodunu kullanmanıza izin vereceği için 'ek' kullanmalısınız. Sunucu üzerinde kontrolünüz yoksa bu iyi bir çözümdür.
Christophe Roussy

Bu sorun için mükemmel bir çözüm, ancak her zaman olduğu gibi IE bizi kullanmaktan alıkoyuyor
Rory McCrossan

1
Bunun etki alanlarında işe yaramadığını belirtmek önemlidir (örneğin, aynı menşei politikası engel olur). Bir alan adından indirme yapılıyorsa, içerik farklı bir alan adına kaydedilmişse indirme özelliği çalışmaz. CORS bu içeriğin geçmesine izin verebilir (test edilmemiştir).
vol7ron

59
Bu kelimenin tam anlamıyla OP'nin ne istediğinin tam tersidir :)
Chuck Le Butt

1
Evet düşündüm! : \ Soruyu yanlış anladım ve cevapladım. Ancak birçok insan buraya sadece tam tersini buluyor, bu yüzden cevabı düzenlemedi / kaldırmadı.
Akshay

16

Doğru tür application/pdfPDF 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:

  • Zorla indirme / bilgi istemi: kullanın header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • Tarayıcı açmaya çalışıyor: 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.


2

Apache'niz varsa bunu .htaccessdosyaya ekleyin :

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

nasıl birden fazla uzantı ekleyebiliriz? DOC ve XLS uzantısı da eklemek istiyorum. Lütfen bana öner. Şimdiden teşekkürler.
Kamlesh


1

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.


4
Önceki yazı nedir?
Peter Mortensen

0

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");
    }

-1

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:

  • Dosyalarınızı projenizdeki bir dizinde depolayın
  • Google PDF Görüntüleyici'yi kullanma

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>

-4

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."\";");
        }

7
PHP kullandıklarından bahsetmiyorum. Arka uçları Python veya .NET'te ise ne olur?
Maxime Rouiller

1
... sol alanın dışında konuşalım. Hangi çerçeveden bahsettiğini bile söylemiyor.
Archonic

-4

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, .htaccessdosya 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ı.


Apache kullandıklarından bahsetmiyorum. IIS kullanıyorlarsa ne olur? Veya Ekspres?
Maxime Rouiller


-7

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>';

1
headeristek gövdesini çıkarmaya başladıktan sonra çalışmaz (ve bir HTML belgesinde birleştirmek için bir dize döndürmez)
Quentin

-9

Adobe Reader'ı açın, menü → DüzenleTercihlerİ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 .


3
AdobeReader kullanmıyorsanız veya pencere kullanmıyorsanız ne olacak? Cevabınız işe yaramayacak. Dahası, kullanıcıdan gerçek dünyada yapamayacağınız ayarlarını değiştirmesini istemek gerekir.
Clawfire

-12

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'); 

Evet, ama indirmemek için tarayıcıda açmaya zorlamak için bir yola ihtiyacım var. Mümkünse hiçbir fikrim yok.
elloalisboa

2
İndirmeye zorlamıyorsanız, tarayıcıda açmaya zorlarsınız. Tarayıcıda açılmazsa, kullanıcının geçersiz kılamayacağınız veya PDF okuma yazılımına sahip olmadığı belirli bir ayarı olduğu için.
Kirk Strobeck

1
Aslında cevabımı gör.
Gabriel Ryan Nahmias

21
Bu yanlış. Uygulama / zorla indirme yok. Alskjdsdjk / aljksdlasdj'yi de kullanabilirsiniz. Tarayıcı bu mime tipini bilmediği için indirilecek. İndirmek için doğru mime türü bana uygulama / octet-stream
Papick G. Taboada
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.