MW211 EXIT

devlog
HTML/ファイルを名称変更してダウンロード
2011年09月30日
ファイル(csvファイルとか)をそのままダウンロードする方法は以下の通り。
┌──────────────────────────────────────┐
│<input type="button" value="入手" onclick="location.href='xxxx.xxx'"/>      │
└──────────────────────────────────────┘

これだと実際にあるファイルをそのままひっぱってくる感じだ。
さて、ここでファイル名を任意の名称に変更したい場合はどうすればよいか?
例えば内部管理用のファイル名と外見えのファイル名が違う場合とかだ。

簡単な方法がみつからない。
とりあえず、以下なら実現できる(ちとめんどくさい)。

まずはformで囲い、POSTメソッドで飛ばす。(たいていは自分に戻ってくるようにする)
ただし、その前にひと手間必要なので、JavaScript関数をはさむ。
┌──────────────────────────────────────┐
│<form method="post" action="">                                              │
│<input type="button" value="入手" onclick="dload(this.form,'xxxx.xxx')"/>   │
│</form>                                                                     │
└──────────────────────────────────────┘

JavaScript関数にて、「$_POST['download']」に変更前のファイル名を入れてsubmit。
┌──────────────────────────────────────┐
│<script type="text/javascript"><!--                                         │
│function dload(inForm, inValue){                                            │
│  var new_element = document.createElement('input');                        │
│  new_element.type  = "hidden";                                             │
│  new_element.name  = "download";                                           │
│  new_element.value = inValue;                                              │
│  inForm.appendChild(new_element);                                          │
│  inForm.submit();                                                          │
│}                                                                           │
│--></script>                                                                │
└──────────────────────────────────────┘
本当はsubmit(のvalueに)にファイル名をぶちこんであげれば楽なのだが
submitボタン名に表示されてしまうので、hidden属性を使う。
ボタン名に表示されても構わないのであればJavaScript不要で以下だけで可。
┌──────────────────────────────────────┐
│<form method="post" action="">                                              │
│<input type="submit" name="download" value="xxxx.xxx"/>                     │
│</form>                                                                     │
└──────────────────────────────────────┘

後はPOST先で、ファイル名を生成してダウンロード実行。
┌──────────────────────────────────────┐
│if (isset($_POST['download'])) {                                            │
│  header('Content-Disposition: attachment; filename="'
                                             . ダウンロードファイル名 . '"'); │
│  header('Content-Type: application/octet-stream');                         │
│  readfile(htmlspecialchars($_POST['download'], ENT_QUOTES));               │
│  exit();                                                                   │
│}                                                                           │
└──────────────────────────────────────┘
分類:HTML