質問
を考える:サーバー上のすべてのアップロードされたPDFファイルは、タイムスタンプが付いています。その後、ユーザは、再びこれらのファイルをダウンロードすることができます。これらの(醜い)ファイル名は、サーバー上で再び変更することはない。
質問:私は、PDFファイルをダウンロードするオプションを与えた場合、ファイルの名前は醜いと長く見えます。どのようにユーザーがこのファイルをダウンロードするときように、私は、賢明な何かにこの名前を変更することができ、名前は奇妙に見えない?
私は、元のファイルの名前を変更するので、コピーを作成するオプションをされていない必要がありますか?それはそれぞれのダウンロード可能なファイルのための余分なオーバーヘッドと思いませんか?明らかに、コピーしたファイルを削除すると、別の余分なステップとなるでしょうか?
ファイルは完全にクライアント側にダウンロードされると、それは可能なファイルの名前を変更しますか?
あなたたちは何を示唆していますか?
解決
このような何かます:
<?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');
?>
他のヒント
私は最近のプロジェクトのためにこれを行うために必要なおよび実装する方法について少し混乱していたが、クラウスの答えを見た後すぐにそれを考え出しました。さらにクラウスの応答については詳しく説明します:
1)、たとえば、 "process.php" というファイルを作成します。元のファイル名と新しい名前:それは2つのパラメータを受け入れるように、クラウスのコードを変更します。私process.phpは次のようになります:
<?php
$file = $_GET['file'];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename='.$_GET['newFile']);
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>
2)プロセッサー・スクリプトを指すユーザー向けのページのリンクを作成します。
<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a>
あなたはContent-Disposition
ヘッダに必要なファイル名を設定する必要があります:
$name = 'desiredname.pdf';
header('Content-Disposition: attachment;filename="' . $name . '"');
しかし残念ながら、これはレドモンドのチームによって開発された特定のWebブラウザーによってピックアップされることはありません。あなたは、それは同様にそのブラウザで動作するように取得したい場合は、要求パスの最後の部分として非常に同じファイル名を追加する必要があります。たとえば、次のようにhttp://example.com/pdf/desiredname.pdf
提供されるコンテンツのファイル名は、HTTPヘッダで定義されています。詳細はヘッダに(もコメント)に PHPのページを見て回ります。
私は(私の場合には、それらの名前を変更するには、それらをダウンロードした人がログインして、それらのファイルを見ることができたことを確認していない)は、PHPを介してファイルを提供し、しばらく前に似た何かをやっていました。私はまた、これらのヘッダを追加しない限り、PDFのダウンロードはIEで動作しないことが判明します:
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');
私がなぜわかりません。実験と何が起こるかを見ます。