4

私は、ユーザーがログインした後にのみ利用できる安全な領域を持つ Web サイトでいくつかの作業を行っています。この領域には、ダウンロードできる PDF ドキュメントへのリンクを含むページがあります。物理的なドキュメントは、Web サイトのルート ディレクトリの外にあります。PDF ドキュメントへのリンクは次のようになります。

index.php?page=secure-area/download&file=protected.pdf

以下を実行します (注: これは、ブラウザでファイルを開くのではなく、ダウンロードを強制する方法であることはわかっています)。

// check security, get filename from request, prefix document download directory and check for file existance then...

header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Connection: Close');
set_time_limit(0);
readfile($file);

これはうまく機能しますが、Firefox 3 と Internet Explorer 7 (他のブラウザーではテストしていません) では、このファイルをブラウザー内で開くことはできず、両方ともダウンロード ダイアログ ボックスが表示されます (予想どおり)。[保存] ではなく [開く] を選択すると、ドキュメントがダウンロードされ、ブラウザーの外部で Adob​​e Reader が起動され、ドキュメントがレンダリングされます。

私が抱えている問題は、ブラウザ内でファイルをダウンロードし、保存すると正しいデフォルトのファイル名を持つことです。

ドキュメントをブラウザで開きたい。これを行う 1 つの方法は、ヘッダー「Content-Disposition: inline;」を使用することです。しかし、これはファイル名を指定できないことを意味します (ブラウザによって無視されるように見えるため)。それを行う際の問題は、ドキュメントを保存するときです。デフォルトの名前は、pdf ドキュメントのファイル名ではなく、URL の名前です。

http___example.com_index.php_page=secure_area_download&file=protected.pdf

Firefox と Internet Explorer でドキュメントをブラウザ内で開き、保存する正しいデフォルト ファイル名を指定するにはどうすればよいですか?

4

5 に答える 5

6

私はついにこの問題の回避策を思いついた。

RFC 2183は、Content-Dispositionヘッダーフィールドの添付ファイルとインラインの両方にファイル名パラメーターを使用できることを示していますが、ブラウザーは、インラインが使用されている場合、ファイル名パラメーターを無視し、ファイル名の基になるものを見つけようとしているようです。 URL。URLにクエリ文字列がない場合、最後の/に続くURLの部分がファイル名として使用されているようです。

保護されたPDFドキュメントをダウンロードするリンクを変更して、クエリ文字列を含まない素敵なURLを使用し、.htaccessファイルでmod_rewriteを使用して、これらの素敵なURLを変換し、正しいパラメーターで正しいスクリプトを実行します。

古いリンク:

index.php?page=secure-area/download&file=document.pdf

新しいリンク:

file/secure-area/download/document.pdf 

.htaccess:

RewriteEngine On
RewriteRule ^file/secure-area/download/(.*)$ index.php?page=secure-area/download&file=$1 [L]

実際にファイルを送信するために使用されるスクリプトは、以前に使用したものと同じです(質問の例では、Content-Disposition:inlineではなくContent-Disposition:attachmentを使用して、ブラウザーがインラインでない場合に正しいファイル名でドキュメントを保存することを示しています)。

// check security, get filename from request, prefix document download directory and check for file existance then...
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="' . basename($file) . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Connection: Close');
set_time_limit(0);
readfile($file);

これで、PDFドキュメントがブラウザ内で開き、保存するとデフォルトのファイル名は次のようになります。

document.pdf

ではなく

http___example.com_index.php_page=secure_area_download&file=document.pdf

IE 7は、保存時にファイル名のスペースを+に、一重引用符を%27に変換します(Firefoxは変換しません)。それが起こらないようにしたいのですが、それまでの間、私は自分の持っているものに満足しています。

于 2008-12-24T01:10:22.843 に答える
1

使ってみて

Content-Disposition: inline;
于 2008-12-19T19:24:11.687 に答える
0

いいえ、彼女が言っているのは、「Content-disposition:inline」が使用されている場合、ファイル名を指定することはできないということです。「Filename」は、最初の例のように、「Content-disposition:attachment」を使用する場合にのみ使用されます。これにより、ドキュメントが正しいファイル名でダウンロードされます。ただし、このソリューションが達成しようとしているのは、インラインでレンダリングされたドキュメントです。これは、ブラウザからダウンロードすると、スクリプト名ではなく正しいファイル名を使用します。

URL書き換え以外に「インライン」を使用するときにファイル名を指定する方法はありますか?ドキュメントをレンダリングするために作成したページはデータベースIDを使用するため、書き換えはより困難になると思います(ファイル名はデータベースから照会する必要があります)。

于 2009-01-19T15:28:58.933 に答える
0

Content-disposition:inlineファイル名とともに使用できます。しかし、これを理解して従うのは一部のブラウザのみです。この効果は、ファイル名を自分で保存した場合にのみ見られます。内容の処理で定義したファイル名が使用されます。

于 2009-10-07T10:31:16.053 に答える
-1

Content-disposition: attachment を使用して、それを行うように指示しています。Content-disposition: inline を使用してみてください。

于 2008-12-19T19:24:57.567 に答える