(HTML)クリックしたときにブラウザーで開く代わりにPDFファイルをダウンロードする


115

ブラウザで開くのではなく、PDFファイルのリンクをダウンロード可能にする方法を知りたいですか?これはHTMLでどのように行われますか?(私はそれがJavaScriptまたは何かを介して行われていると思います)。


3
これは私の知る限り、スクリプト可能な動作ではありません。ほとんどのブラウザには、ダウンロード時に特定のファイルタイプをどうするかについての動作に関する独自の設定があります。
Bart、

1
HTML5以降、OPはSarimの回答に対する正しい回答を更新する必要があります。
Omar Tariq 2013


この質問の回答もここにあります: stackoverflow.com/a/30714824/847235
intrepidis

回答:


38

HTMLではこれを行うことはできません。これはサーバーベースのソリューションです。ブラウザが保存ダイアログをトリガーするように、ファイルをストリーミングする必要があります。

これをしないことをお勧めします。ユーザーがPDFを操作する方法は、ユーザーに委ねる必要があります。

更新(2014):

だから...この答えはまだたくさんの反対票を獲得しています。その一部は、これが4年前に回答されたと思います。Sarimが指摘したように、これを処理できるHTML 5 download属性があります。

私は同意し、Sarimの答えは良いと思います(OPが戻る場合は、おそらくそれが選択された答えになるはずです)。ただし、この答えは依然としてそれを処理するための信頼できる方法です(YiğitYenerの答えが指摘し、奇妙なことに、人々は同意します)。ダウンロード属性はサポートを獲得しましたが、まだむらがあります。

http://caniuse.com/#feat=download


18
これが1歳であることは知っていますが、同意しません。この動作を強制することがアプリケーションフローにとって非常に重要である状況があります。実際の答えは、ヘッダーのcontent-Dispositionを「inline」ではなく「attachment」に設定することです。
user158017

9
他の状況では、ユーザーの制御に任せた方がよいことに同意します。しかし、私は答えを探してこのスレッドに来て、チェックされた「答え」は答えではなく、「それをしてはいけない」でした。私にとって、それは質問に対する答えではありません。代わりに、具体的な回答と助言
user158017

1
時々質問は間違っています。;)とにかく、あなたの問題に関しては、それはすべてUXの問題です。特定の方法でWebを動作させることが必要になることもありますが、UXの観点からはより良い解決策がしばしばあります。また、私の答えは正しいです。HTMLでやりたいことを実行することはできません(これは質問が求めていたものです)。これはサーバー側のソリューションです。
DA。

1
これはこれまでに投稿された私の奇妙な答えの1つです。人々はまだここでそれを反対投票する方法を見つけます。大丈夫です!しかし、その理由を知ることは興味深いでしょう。
DA。

3
その反対投票については、文中で意図せずに傲慢に出会うのがどれほど簡単かという文明の没落かもしれません。この答えは、私が意見を支持することに長々と答え、短いものに私を襲います。段落1の代わりhttpに、質問にタグを追加するだけです。パラグラフ2の代わりに、「すべてのユーザーにとって、PDFの即時表示を防止することが最善であるかどうかを再検討する必要があるかもしれません。次に、OPと将来の読者が大人であると想定し、Yener'sのような実用的な答えに進みます。。
ボブスタイン

133

html5では、それが可能になりました。要素に「ダウンロード」属性を設定します。

<a href="http://link/to/file" download="FileName">Download it!</a>

出典:http : //updates.html5rocks.com/2011/08/Downloading-resources-in-HTML5-a-download


サポートされている場合は、このソリューションを使用することをお勧めします。どうかを確認する方法はif ("download" in document.createElement("a")){ ... }
次のとおり

以下に別の回答を追加しました(ただし、不正なハッキングです)。これはまだ推奨される方法ですが、おそらくハッキングの方法は、サポートされていないブラウザーに提供できます。
サリム

ファイルパスに言及する代わりにpdfのテキストを指定できる方法はありますか?私はdivのHTMLが、私は別のウィンドウを開くことを希望しない、ダウンロードはこの答えのようにシームレスでなければなりません。..からPDFを作成する必要があります
T.Adak

1
現在2019年8月の時点で、この機能に対するブラウザサポートが強化されているようです。次を参照してください:w3schools.com/tags/att_a_download.asp
Daniel Resch

2
ダウンロード属性は、同一生成元のリクエストでのみサポートされていることに注意してください。
クエンティン

82

これは、サーバー側のコードでhttp応答ヘッダーを設定した場合にのみ可能です。つまり、

Content-Disposition: attachment; filename=fname.ext

2
これは完璧な答えです。適切なサーバー側言語でそれを行う方法を見つけてください。
user158017


残念ながら、コンテンツの配置が「添付」であっても、iOSは引き続きPDFファイルをプレビューしてダウンロードしません。
Jorn van de Beek、

14

送信されるhttpヘッダーを変更する必要があります。サーバーによっては、次のように.htaccessを変更できます。

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

コンテンツタイプについて嘘をつく必要はありません。content-dispositionを設定するだけで十分です。
クエンティン

9

PHPスクリプト(またはこのための他のサーバー側言語)を使用する必要があります

<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');

// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf
readfile('original.pdf');
?>

そして、httaccesを使用して、PDFの代わりにPHPファイルにリダイレクト(書き換え)します。


うーん、phpファイルを直接開いたときにうまくいきます。しかし、次のようにリダイレクトを使用しようとすると、301 /_PDFs/Catalogue.pdf http://www.example.com/_PDFs/___download_the_catalogue_instead_opening.phpをリダイレクトし てpdfファイルを開こうとすると、ブラウザーで元のファイルが開かれ、名前が変更されたバージョンがダウンロードされます...
ellockie

更新:(私の例では「Catalogue.pdf」のように)直接呼び出されているファイルがない場合に機能します。その後、リダイレクトは完全に機能します。ありがとう!
ellockie 2015

8

使用できます

Response.AddHeader("Content-disposition", "attachment; filename=" + Name);

この例を確認してください:

http://www.codeproject.com/KB/aspnet/textfile.aspx

これはASP.NETにも当てはまります。他のすべてのサーバー側言語で同様のソリューションを見つけることができると思います。ただし、私の知る限りではJavaScriptによる解決策はありません。


これが答えです(PHPの関連する問題も同様です)。ポイントは、http応答ヘッダーを編集する必要があることです。
user158017

5

html5属性がなければ、phpを使用してこれを実現できます。

次のコードを使用して、download.phpという名前のphpファイルを作成します。

<?php
ob_start();
$file = "yourPDF.pdf"

if (file_exists($file)) 
{
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit();
}

次に、PDFのダウンロードを自動的に開始する場合は、次のJavaScriptを記述します。

<script>window.location = "download.php";</script>

これをリンクで機能させたい場合は、これを使用してください...

<a href='javascript:window.location = "download.php"'>
    Download it!
</a>

4
URLパラメータを使用してこれを行う場合は注意が必要であることを示します。例えば$file = $_GET['$file'];download.php?file=../../../wp-config.phpそれは、他の与えられたリソースを呼び出すこともできるからです。拡張機能、mimeタイプ、およびダウンロード元として許可されているパス(および「../」のようなものを取り除く)の追加チェックは非常に重要です!
Giel Berkers 2015

それが私であるのか、それとも<a href='javascript...'>を行うのは、リンクを直接挿入するのとまったく同じです<a href='download.php'> ?
allan.simon

5

新しいタブで開く代わりにブラウザから画像またはpdfファイルを直接ダウンロードする場合は、JavaScriptで、値を動的リンクの作成のダウンロード属性に設定する必要があります

    var path= "your file path will be here"; 
    var save = document.createElement('a');  
    save.href = filePath; 
    save.download = "Your file name here"; 
    save.target = '_blank'; 
    var event = document.createEvent('Event');
    event.initEvent('click', true, true); 
    save.dispatchEvent(event);
   (window.URL || window.webkitURL).revokeObjectURL(save.href);

新しいChromeの更新の場合、タイムイベントが機能しません。そのため、次のコードが使用されます

  var path= "your file path will be here"; 
    var save = document.createElement('a');  
    save.href = filePath; 
    save.download = "Your file name here"; 
    save.target = '_blank'; 
    document.body.appendChild(save);
    save.click();
    document.body.removeChild(save);

子の追加と削除は、Firefox、Internet Explorerブラウザーでのみ役立ちます。クロムでは、子を追加および削除せずに動作します


2

私にとって最も効果的な解決策は、ニックがブログに書いたものでした。

彼のソリューションの基本的な考え方は、Apacheサーバーのヘッダーmodを使用し、.htaccessを編集して、すべての* .pdfファイルを添付ファイルではなくストリームとして機能させるFileMatchディレクティブを含めることです。これには実際にはHTMLの編集は含まれませんが(元の質問に従って)、プログラミング自体は必要ありません。

私がニックのアプローチを好んだ最初の理由は、フォルダーごとに設定できるので、1つのフォルダー内のPDFをブラウザーで開いたまま、他のフォルダー(ユーザーが編集して再アップロードしたいフォルダー)を許可できるためです。ダウンロードとして強制されます。

また、PDFには、APIを介してサーバーに入力可能なフォームを投稿/送信するオプションがありますが、実装には時間がかかります。

2番目の理由は、時間を考慮することです。header()でコンテンツの配置を強制するPHPファイルハンドラーを作成することも、APIよりも時間がかかりませんが、Nickのアプローチよりも時間がかかります。

Apache modをオンにして.htaccssを編集する方法を知っている場合は、約10分で取得できます。(Windowsではなく)Linuxホスティングが必要です。構成するには高レベルのサーバーアクセスが必要なため、これはすべての用途に適切なアプローチとは限りません。そのため、アクセスと言ったのは、おそらくこれら2つのことを行う方法をすでに知っているからです。そうでない場合は、ニックのブログで詳細な手順を確認してください。


2

html5の方法(私の以前の答え)はすべてのブラウザーで使用できるわけではないため、もう1つの方法は少しハックです。

このソリューションでは、同じドメインから目的のファイルを提供している、またはCORS権限を持っている必要があります。

  1. まず、XMLHttpRequest(Ajax)を介してファイルのコンテンツをダウンロードします。
  2. 次に、ファイルのコンテンツをbase64エンコードしてデータURIを作成し、media-typeをに設定しapplication/octet-streamます。結果は次のようになります

data:application/octet-stream;base64,SGVsbG8sIFdvcmxkIQ%3D%3D

設定しlocation.href = dataます。これにより、ブラウザがファイルをダウンロードします。残念ながら、この方法でファイル名や拡張子を設定することはできません。メディアタイプをいじると、何かが生まれるかもしれません。

詳細を見る:https : //developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs


1

特定のフォルダーに動的な名前で作成され、IISによって提供されるファイルに対して、これを行う必要がありました。

これは私のために働きました:

  • IISで、そのフォルダーに移動し、[HTTP応答ヘッダー]をダブルクリックします。
  • 次の情報を含む新しいヘッダーを追加します。

    Name: content-disposition Value: attachment

(from:http : //forums.iis.net/t/1175103.aspx?add+CustomHeaders+only+for+certain+file+types+


1

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

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

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


悲しいことに、私はこのタグを理解できないほど愚かであることを認めざるを得ません。私はこれを入れます:<a href="download/Curriculum_it.pdf.zip">Download curriculum</a>またはそれ:<a href="download/Curriculum_it.pdf.zip" download="Curriculum_it">Download curriculum</a>それがどのように機能するかについてはまったく違いがわかりません。どちらも.zipをダウンロードしています。そして、2番目の方法では、ファイル名オプションを使用してもまったく何もしないようです。
Garavani

0

動作は、ブラウザがさまざまなMIMEタイプを処理するように設定されている方法に依存する必要があります。この場合、MIMEタイプはapplication / pdfです。ブラウザに強制的にファイルをダウンロードさせたい場合は、PDFファイルに別のMIMEタイプを強制することができます。ユーザーがPDFファイルを開いたときに何が起こるかを選択する必要があるため、これはお勧めしません。


0

download.js(https://github.com/rndme/downloadおよびhttp://danml.com/download.html)を使用できます。ファイルが外部URLにある場合は、Ajaxリクエストを行う必要がありますが、そうでない場合は、次の関数を使用できます。

download(Path, name, mime)

詳細については、GitHubのドキュメントをご覧ください。


これは、別のドメインでのダウンロードに最適なJavaScriptソリューションです。
エドハウラー

-1

最後に、動的アンカータグを作成してクリックしました。

<script> 
   $('#myclick').click(function(){
       $('body').append('<a id="link" href="mypdf.pdf" 
        download="Payment.pdf">&nbsp;</a>');
       $('#link')[0].click();
   });
</script>

「Payment.pdf」はカスタム名専用です。


リンクを動的に生成する必要はありません。
クエンティン

ダウンロード属性は、同一生成元のリクエストでのみサポートされていることに注意してください。
クエンティン

これは3年前のこれと同じ答えのようです。
クエンティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.