このアプローチを使用して、Web アプリケーションからファイルへの各リンクの近くにアイコンを表示しています。
IE の履歴キャッシュの問題を回避するために、リンクを次のように表示します。
<a href="path/to/the/file.xls?timestamp=0234562">FileName.xls</a>
.
この場合、css ルールは機能しません。
どうすればこの問題を解決できるか知っていますか?
おそらく使用するセレクターa[href$='.xls']
は、HREF の値の末尾に一致する場合にのみ適用されます。a[href*=.xls]
代わりに使用してください。
セレクター レベル 3からの抜粋:
[att*=val]
att
部分文字列「val」のインスタンスを少なくとも 1 つ含む値を持つ属性を持つ要素を表します。「val」が空の文字列の場合、セレクターは何も表していません。
編集
.htaccess ファイルを制御できる場合は、キャッシュの問題を回避するためにそこにあることを確認して、元のスタイルシート ルールを使用できるようにすることができます。詳細については、Apache および .htaccessを使用したキャッシュ制御ヘッダーを参照してください。
問題は、アンカーa[href$='.xls']
の属性の末尾と一致するhref
ことですが、タイムスタンプを追加しているため、その href の末尾は実際にはタイムスタンプです。
キャッシュの問題を回避するには、プロキシを使用してダウンロードを処理できます。つまり、ファイルのダウンロードをトリガーするスクリプトを使用します。PHP では、readfile() 関数とキャッシュなしヘッダーの送信で簡単に実現できます。次に例を示します。
<a href="download.php?file=spreadsheet.xls">spreadsheet.xls</a>
しかし、あなたが使用しているプログラミング言語がわからないので、これ以上は言えません。
ダンカン、これはすでに回答されていることを知っていますが、あなたのコメントのために、ここにあなたのために働くはずの機能があります. PHPマニュアルまたは他の例からほぼまっすぐだと思います。ファイルのアクセス許可の確認、アップロードなどの他のことを処理するクラスにこれがあります。必要に応じて変更してください。
public function downloadFile($filename)
{
// $this->dir is obviously the place where you've got your files
$filepath = $this->dir . '/' . $filename;
// make sure file exists
if(!is_file($filepath))
{
header('HTTP/1.0 404 Not Found');
return 0;
}
$fsize=filesize($filepath);
//set mime-type
$mimetype = '';
// mime type is not set, get from server settings
if (function_exists('finfo_file'))
{
$finfo = finfo_open(FILEINFO_MIME); // return mime type
$mimetype = finfo_file($finfo, $filepath);
finfo_close($finfo);
}
if ($mimetype == '')
{
$mimetype = "application/force-download";
}
// replace some characters so the downloaded filename is cool
$fname = preg_replace('/\//', '', $filename);
// set headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $mimetype");
header("Content-Disposition: attachment; filename=\"$fname\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);
// download
$file = @fopen($filepath,"rb");
if ($file)
{
while(!feof($file))
{
print(fread($file, 1024*8));
flush();
if (connection_status()!=0)
{
@fclose($file);
die(); // not so sure if this best... :P
}
}
@fclose($file);
}
}