[ブラウザで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");
サーバーコードを制御できない:
注:詳細情報があり、一般的なコードを使用できるため、サーバー側でファイル名を設定することをお勧めします。
以前の投稿で入力エラーがありました。
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
ブラウザでユーザーにプロンプトを表示させたくない場合は、3番目の文字列に「attachment」の代わりに「inline」を使用します。インラインは非常にうまく機能します。ユーザーに[開く]をクリックするように求めることなく、PDFがすぐに表示されます。私は「添付ファイル」を使用しており、これによりユーザーは開く、保存するように求められます。ブラウザの設定を変更しようとしましたが、プロンプトを妨げません。
これは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>
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."\";");
}
これは次の方法で実行できます。
<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');