質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

4205閲覧

ファイルのダウンロードの際に、ファイル名ではなく、別名でダウンロードを行うようにしたい

Ruse

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2017/06/26 09:04

###前提・実現したいこと
現在、phpとhtmlを使用して、テーブル内の項目をリストで一覧表示し、
項目を選択するとファイルをダウンロードさせる物を作成しています。

現在、リスト<li>要素に対して、

<li><a href="AAA.xls(ファイル名)">BBBB(日本語名称:本来の名称)</a></li>として、 項目選択すると hrefで指定したファイルをダウンロードさせています。 ですが、このままだとファイル名はAAA.xlsでダウンロードされてしまいます。 これをBBBB.xlsでダウンロードさせたいのですが、どのようにすれば良いのでしょうか

###補足情報(言語/FW/ツール等のバージョンなど)
php5.6.7、Postgresql9.4.1を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

PHP

1header("Content-type: application/octet-stream"); 2header("Content-Disposition: attachment; filename=\"BBBB.xls\"");

のようにサーバー側でダウンロード名を指定することは可能です。

IEを除くモダンブラウザなら
クライアント側の
<a download="BBBB.xls" href="AAA.xls">test</a>
のような処理も可能ですが、IEへの対応のためにBLOBの処理などをいれないと
汎用性に欠けるでしょう

投稿2017/06/26 09:47

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

index.php

html

1<!DOCTYPE HTML> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <a href="download.php">Download</a> 9 </body> 10</html>

download.php

php

1<?php 2 3/** 4 * download.php 5 */ 6$localfile = 'sample.xlsx'; 7$file = file_get_contents($localfile); 8 9$filename = "日本語.xlsx"; 10header("Pragma: public"); 11header("Expires: 0"); 12header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 13header("Content-Transfer-Encoding: binary "); 14header('Content-Type: application/octet-streams'); 15header(sprintf("Content-Disposition: attachment; filename=\"%s\"", $filename)); 16echo $file; 17exit();

投稿2017/06/26 11:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ruse

2017/06/27 02:43

この2つでダウンロードを行うことができることを確認できました。 1点質問なのですが、index.php側からdownload.phpにファイル名を送りたい(例で言うとAAA.xlsとBBBB.xlsです。)のですが、この場合$_COOKIEや$_SESSION関数等で値を渡せば良いのでしょうか
Ruse

2017/07/31 08:00

php同士でファイル名をSESSIONで受け渡すことにより成功しました。 ありがとうございます。
guest

0

ファイルを読んで出力するphpスクリプトを作って
出力する際にheaderでfilename指定するのは
どうでしょうか。

投稿2017/06/26 09:16

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

a タグ直リンクではダメです。

応答ヘッダーの Content-Disposition: attachment; filename= でファイル名と拡張子を指定できるようにしてください。

PHP で具体的にどのようなコードを書けばできるかは分かりませんが・・・

なお、ブラウザによって、応答ヘッダーの Content-Disposition: attachment; filename= で指定するファイル名の拡張子と、Content-Type: で指定する MIME Type のどちらでファイルの種類を判断するかが異なります。

なので、Content-Type と Content-Disposition の両方を正しく設定してやる必要があります。

ブラウザによっては、Content-Disposition でファイル名と拡張子を指定しても、Content-Type の指定通り拡張子を書き換えてしまうものがあります。以下の記事の Opera がその例です。

ダウンロードの際の拡張子 と MIME Type の指定
http://surferonwww.info/BlogEngine/post/2010/09/02/Downloading-file-by-setting-extension-and-mime-type-in-header.aspx

【追伸】

Content-Disposition: attachment; filename= で指定するファイル名が日本語ですと IE では文字化けするので注意してください。回避策はあります。詳しくは以下の記事を見てください。

ダウンロードファイル名の文字化け
http://surferonwww.info/BlogEngine/post/2011/03/20/Downloading-file-with-Japanese-file-name.aspx

投稿2017/06/26 09:44

編集2017/06/26 09:54
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問