132

以下のように、ダウンロード用に私のWebページにpdfファイルのリンクを提供しています

<a href="myfile.pdf">Download Brochure</a>

問題は、ユーザーがこのリンクをクリックしてから

  • ユーザーが Adob​​e Acrobat をインストールしている場合は、Adobe Reader の同じブラウザー ウィンドウでファイルを開きます。
  • Adobe Acrobat がインストールされていない場合は、ファイルをダウンロードするためのポップアップが表示されます。

しかし、「Adobe acrobat」がインストールされているかどうかに関係なく、常にユーザーにダウンロード用のポップアップが表示されるようにします。

どうすればこれができるか教えてください。

4

14 に答える 14

234

これはよくある問題ですが、簡単な HTML 5 ソリューションがあることを知っている人はほとんどいません。

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>

newfilenameユーザーがファイルを保存するための推奨ファイル名はどこですか。または、次のように、空のままにしておくと、サーバー側のファイル名がデフォルトになります。

<a href="./directory/yourfile.pdf" download>Download the pdf</a>

互換性: Firefox 21 と Iron でテストしましたが、どちらも問題なく動作しました。HTML5 に対応していないブラウザや古いブラウザでは動作しない場合があります。ダウンロードを強制しなかった私がテストした唯一のブラウザはIEです...

ここで互換性を確認してください: http://caniuse.com/#feat=download

于 2013-06-09T15:46:50.117 に答える
118

.PDF ファイルにリンクする代わりに、次のようなことを行います。

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

これは、カスタム ヘッダーを出力し、PDF (バイナリセーフ) を開き、データをユーザーのブラウザーに出力します。ユーザーは、ブラウザーの設定に関係なく、PDF を保存することを選択できます。pdf_server.php は次のようになります。

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp); 

PS: 明らかに、「ファイル」変数に対していくつかの健全性チェックを実行して、ファイル拡張子を受け入れない、スラッシュを拒否する、値に .pdf を追加するなど、人々がファイルを盗むのを防ぎます。

于 2008-12-13T07:18:13.147 に答える
50

すべてのファイル行をループしないでください。代わりにreadfileを使用してください。これはphpサイトから外れています:http: //php.net/manual/en/function.readfile.php

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

誰かがいくつかのphpファイルをダウンロードする可能性があるので、get変数をサニタイズするようにしてください...

于 2011-11-14T13:35:59.197 に答える
24

PHP スクリプトを使用してファイルを読み取ってフラッシュする代わりに、.htaccess. これにより、「適切な」URL (myfile.pdfの代わりにdownload.php?myfile) が保持されます。

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
于 2012-02-09T10:24:00.613 に答える
14

プレーンな古い HTML と JavaScript/jQuery を使用して、適切に機能を低下させる方法を見つけました。IE7-10、Safari、Chrome、および FF でテスト済み:

ダウンロード リンクの HTML:

<p>Thanks for downloading! If your download doesn't start shortly, 
<a id="downloadLink" href="...yourpdf.pdf" target="_blank" 
type="application/octet-stream" download="yourpdf.pdf">click here</a>.</p>

少し遅れてリンクのクリックをシミュレートするjQuery(純粋なJavaScriptコードはより冗長になります):

var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);

これをより堅牢にするために、HTML5 機能の検出を追加することができます。そこにない場合はwindow.open()、新しいウィンドウを開いてファイルを開きます。

于 2013-08-06T14:59:06.100 に答える
7

これが鍵です:

header("Content-Type: application/octet-stream");

PDF ファイルの送信中に、コンテンツ タイプの application/x-pdf-document または application/pdf が送信されます。Adobe Reader は通常、この MIME タイプのハンドラーを設定するため、PDF MIME タイプのいずれかを受信したときにブラウザーがドキュメントを Adob​​e Reader に渡します。

于 2008-12-13T07:27:19.617 に答える
0

ここに別のアプローチがあります。私は、ブラウザーのサポートに依存したり、アプリケーション層でこれに対処したりするよりも、Web サーバー ロジックを使用することを好みます。

Apache を使用していて、関連するディレクトリに .htaccess ファイルを配置できる場合は、以下のコードを使用できます。もちろん、アクセスできる場合は、これを httpd.conf に入れることもできます。

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

FilesMatch ディレクティブは単なる正規表現であるため、必要に応じて細かく設定したり、他の拡張子を追加したりできます。

ヘッダー行は、上記の PHP スクリプトの最初の行と同じことを行います。Content-Type 行も設定する必要がある場合は、同じ方法で設定できますが、その必要はないと思います。

于 2016-11-29T16:52:53.317 に答える
0

ダウンロード速度を制限する必要がある場合は、このコードを使用してください!!

<?php
$local_file = 'file.zip';
$download_file = 'name.zip';

// set the download rate limit (=> 20,5 kb/s)
$download_rate = 20.5;
if(file_exists($local_file) && is_file($local_file))
{
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($local_file));
header('Content-Disposition: filename='.$download_file);

flush();
$file = fopen($local_file, "r");
while(!feof($file))
{
    // send the current file part to the browser
    print fread($file, round($download_rate * 1024));
    // flush the content to the browser
    flush();
    // sleep one second
    sleep(1);
}
fclose($file);}
else {
die('Error: The file '.$local_file.' does not exist!');
}

?>

詳細については、ここをクリックしてください

于 2019-02-06T05:30:29.490 に答える
0

これを試して:

<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>

pdf_server_with_path.php 内のコードは次のとおりです。

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
$path = $_GET["path"];
$fullfile = $path.$file;

header("Content-Disposition: attachment; filename=" . Urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . Filesize($fullfile));
flush(); // this doesn't really matter.
$fp = fopen($fullfile, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);
于 2012-06-21T02:15:48.260 に答える
-1

Ruby on Rails アプリケーション (特に Prawn gem や Prawnto Rails プラグインなど) では、完全なスクリプト (前の PHP の例のように) よりも少し簡単にこれを実現できます。

コントローラーで:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

render :layout => false の部分は、ブラウザーに「このファイルをダウンロードしますか?」を開くように指示します。PDF のレンダリングを試行する代わりにプロンプ​​トを表示します。その後、通常どおりファイルにリンクできます: http://mysite.com/myawesomepdf.pdf

于 2008-12-13T07:49:25.253 に答える