ダウンロード(PDF)の代わりにブラウザでファイルを強制的に開くにはどうすればよいですか?


208

[ブラウザでPDFを表示]オプションがオフになっている場合に、PDFファイルをブラウザで強制的に開く方法はありますか?

埋め込みタグとiframeを使用してみましたが、そのオプションがチェックされている場合にのみ機能します。

私に何ができる?

回答:


417

ファイルをブラウザーで表示する必要があることをブラウザーに示すには、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応答を生成する場合:サーバー側プログラミング言語)。


13
ダウンロードを強制するには、Content-Type:application / octet-streamを使用します。
Papick G. Taboada 2013

25
@ PapickG.Taboadaが、ユーザーのシステムがファイルの種類を知らない可能性があります。たとえば、一部のユーザーはPDFファイルに対して「常にこのタイプのファイルを開く」を選択している場合があります。おそらく、ユーザーの設定を上書きしたい場合は、オクテットストリームが適していますが、正しいタイプと推奨されるファイル名を指定することは、ダウンロードを提供する「正しい」方法です。
ColinM 2013年

2
こんにちは@ColinM私はここで少し混乱しています... PDFのレンダリングに問題があります。スクランブルされたテキストが表示されるだけです。Content-Type:application / pdf Content-Disposition:inlineはどこに設定しますか?「filename.pdf」?'cos、angular-jsコードを使用してアップロードします。だから私の質問は、アップロードする前にコンテンツタイプを設定すべきですか?また、バックエンドチームからのリンク、つまりファイルパスを指定するURLのみを取得します。これは、次のように新しいタブで開きます。window.open(url、 '_blank')。focus();
Kailas

3
@Kailasあなたが何をしようとしているのか理解できません。答えは、PDFファイルのHTTPリクエストに応答するときにサーバーがクライアントに送信する必要があるヘッダーを参照しています。これらのヘッダーはファイルのアップロードに影響を与えません。クライアントがダウンロードするたびに、URLの背後にあるコードでヘッダーを設定する必要があります。
ColinM 14

1
@ColinMありがとうバディ、あなたはそれを正しく言った、私たちがデバッグしたときの問題は、ファイルのアップロード中に設定されたMIMEタイプでした。これはバックエンドチームが行う必要があります。Javaスクリプトでヘッダーを追加する方法のコードを取得しようとしましたが、成功しませんでした。ありがとう、私はあなたから本当の考えを明確にしたので... :)
Kailas

19

HTML5を使用している場合(そして今日では誰もがそれを使用していると思います)、という属性がありますdownload

例えば、

<a href="somepathto.pdf" download="filename">

これfilenameはオプションですが、指定した場合、ダウンロードしたファイルにこの名前が付けられます。


2
サーバーコードを制御できる場合は、「ファイル添付」を使用する必要があります。これにより、同じファイル名生成コードを使用できるようになります。サーバーを制御できない場合、これは良い解決策です。
Christophe Roussy、2015

これは問題に対する素晴らしい解決策ですが、いつものように、IEは私たちがそれを使用するのを阻止
Rory McCrossan

1
これはドメイン間では機能しないことに注意してください(たとえば、同じ生成元のポリシーが邪魔をする)。あるドメインからダウンロードする場合、コンテンツが別のドメインに保存されていると、ダウンロード属性は機能しません。CORSは、そのコンテンツの通過を許可する場合があります(テストされていません)。
vol7ron 2017年

59
これは文字通り、OPが要求するものの反対です:)
Chuck Le Butt

1
はい、考えました!:\質問が間違っていることを理解して回答しました。しかし、多くの人がここに着くと、正反対のみを見つけます。そのため、回答を編集または削除しないでください。
Akshay 2017

16

正しいタイプはapplication/pdfPDF用であり、ではありませんapplication/force-download。これは、一部のレガシーブラウザのハックのように見えます。可能であれば、常に正しいMIMEタイプを使用してください。

サーバーコードを制御できる場合:

  • 強制ダウンロード/プロンプト:使用 header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • ブラウザはそれを開こうとします:使用 header("Content-Disposition", "inline; filename=myfilename.myextension");

サーバーコードを制御できない:

注:詳細情報があり、一般的なコードを使用できるため、サーバー側でファイル名を設定することをお勧めします。


2

Apacheがある場合は、これを.htaccessファイルに追加します。

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

複数の拡張機能を追加するにはどうすればよいですか?DOCとXLS拡張も追加したいと思います。親切に私を提案してください。前もって感謝します。
Kamlesh

これは求められていることとは逆です
クエンティン

1

以前の投稿で入力エラーがありました。

    header("Content-Type: application/force-download");
    header("Content-type: application/pdf");
    header("Content-Disposition: inline; filename=\"".$name."\";");

ブラウザでユーザーにプロンプ​​トを表示させたくない場合は、3番目の文字列に「attachment」の代わりに「inline」を使用します。インラインは非常にうまく機能します。ユーザーに[開く]をクリックするように求めることなく、PDFがすぐに表示されます。私は「添付ファイル」を使用しており、これによりユーザーは開く、保存するように求められます。ブラウザの設定を変更しようとしましたが、プロンプトを妨げません。


4
以前の投稿は?
Peter Mortensen

0

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

-1

以下はFirefoxで正常に機能しますが、Chromeおよびモバイルブラウザでは機能しません。

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

Chromeおよびモバイルブラウザのエラーを修正するには、次の手順を実行します。

  • プロジェクト内のディレクトリにファイルを保存する
  • Google PDF Viewerを使用する

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>

-4

rootfileからdownloads.phpを開きます。

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

7
彼らがPHPを使用していることは言うまでもありません。バックエンドがPythonまたは.NETの場合はどうなりますか?
Maxime Rouiller、2015

1
...レフトフィールド外について話します。彼は、自分が話しているフレームワークについても述べていません。
Archonic

-4

これは次の方法で実行できます。

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

しかし、今は特定の必要なファイルだけを許可します。

私はこのコードを使用しましたが、完全に機能しました。


彼らがApacheを使用していることは言うまでもありません。IISを使用している場合はどうなりますか?またはエクスプレス?
Maxime Rouiller、2015


-7

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

1
headerリクエストの本文の出力を開始した後は機能しません(HTMLドキュメントで連結するための文字列を返しません)
Quentin

-9

ただ、オープンのAdobe Reader、メニュー→ 編集設定インターネットは、その後、試すブラウザモードに変更するか、別のブラウザで詳細な手順については、PDFをブラウザに表示します| Acrobat、Acrobat Reader


3
AdobeReaderを使用しない場合、またはWindowsを使用しない場合はどうなりますか?答えはうまくいきません。さらに、設定を変更するようユーザーに要求する必要がありますが、これは現実の世界ではできません。
Clawfire 2016

-12

.PDFにリンクすると、ブラウザで開きます。
チェックボックスがオフの場合、.zipにリンクしてダウンロードを強制する必要があります。

.zipがオプションでない場合は、PHPのヘッダーを使用してダウンロードを強制します。

header('Content-Type: application/force-download'); 
header('Content-Description: File Transfer'); 

はい。ただし、ダウンロードせずにブラウザで強制的に開く方法が必要です。それが可能かどうかはわかりません。
elloalisboa

2
ダウンロードを強制しない場合は、ブラウザで強制的に開く必要があります。ブラウザーで開かない場合は、ユーザーが特定の設定を持っているためで、それを上書きできないか、PDF読み取りソフトウェアがないためです。
Kirk Strobeck、2011年

1
実際、私の答えを見てください。
Gabriel Ryan Nahmias 2012

21
これは間違っています。アプリケーション/強制ダウンロードはありません。alskjdsdjk / aljksdlasdjも使用できます。このMIMEタイプを認識していないため、ブラウザがダウンロードします。ダウンロードに適したMIMEタイプは、私にapplication / octet-streamです
Papick G. Taboada 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.