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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

3回答

6323閲覧

cakephpでのIE/Edge文字化け対策ファイルダウンロードについて

yuki84web

総合スコア1857

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/12/07 08:46

編集2016/12/07 10:08

日本語名指定でファイルをダウンロードする画面がありますが、
IEとEdgeのみファイル名が文字化けするので下記を参考に修正しましたがダウンロード出来なくなってしまいました。
どこに原因があるのでしょうか?
また、原因を特定するためのデバッグ方法等がありましたらご教授下さい。

元々参考にした方法:

CakePHP CakeResponseを使ったファイルのダウンロード
http://qiita.com/madiehak/items/9b104be97c4c37a3465d

参考した対策法:

CakePHP2の $this->response でファイルをダウンロードさせるときのIEファイル名文字化け解消
http://qiita.com/aion/items/e10f23f76bca7d1f4fb2

View/Hogehoge/index.ctp

javascript

1$scope.clickb = function() { 2 $('#iframe_id')[0].contentDocument.location.replace('/Hogehoge/download_ajax'); 3}

Controller/HogehogeController

php

1function download_ajax(){ 2 $this->download('hogehoge.docx'); 3} 4function download($file_name = null) { 5 // viewを使用しない 6 $this->autoRender = false; 7 8 // ファイルがcake/app/webroot/files以下にあるとき 9 // WWW_ROOT, DS は定数 公式サイト参照 10 $file_path = WWW_ROOT.'application'.DS.$file_name; 11 12 // [削除]response->file()でダウンロードもしくは表示するファイルをセット 13 //$this->response->file($file_path); 14 // [削除]pdfをブラウザ上で開かせるような場合はこちら 15 //$this->response->body($file_name); 16 // [削除]ファイル名指定 17 //$this->response->download('ほげほげ.txt'); //これだとIE/Edgeで文字化けする 18 19 // [追加]-> 20 $file = $this->Attachment->getFile($file_path); 21 $filename = 'ほげほげ.txt'; 22 $content = 'attachment;'; 23 $content .= 'filename='.$filename; 24 $content .= 'filename*=UTF-8\'\''.rawurlencode($filename); 25 $this->response->header('Content-Disposition', $content); 26 $this->response->file($file['path']); 27 28 // レスポンスオブジェクトを返すとコントローラがビューの描画を中止します 29 return $this->response; 30 // <-[追加] 31}

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

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

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

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

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

guest

回答3

0

$content = 'attachment;';
$content .= 'filename='.$filename;
$content .= 'filename*=UTF-8'''.rawurlencode($filename);

上記のコードで、Content-Disposition ヘッダフィールドは、RFC 6266 に準拠した、

attachment;filename*=utf-8''<パーセントエンコーディングされたファイル名>

のようになっているでしょうか?

ハズレだったらすみません。

投稿2016/12/07 09:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuki84web

2016/12/07 10:09

httpレスポンスの中身を確認せよとのことでしょうか? 調べ方を調査してやってみます。
退会済みユーザー

退会済みユーザー

2016/12/07 10:12

Fiddler が使いやすいのでお勧めです。
guest

0

PHP

1$file = $this->Attachment->getFile($file_path);

この行を削除して

PHP

1$this->response->file($file['path']);

これを

PHP

1$this->response->file($file_path);

にすればよいのでは。

投稿2016/12/07 08:57

kunai

総合スコア5405

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

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

yuki84web

2016/12/07 09:15

ありがとうございます。 ダウンロードは出来るようになりましたが、何故か指定したファイル名「ほげほげ.txt」ではなく関数呼び出し元の関数名がファイル名「download_ajax.txt」になってしまいました…。 呼び出し元: function download_ajax(){ $this->download('hogehoge.txt'); }
kunai

2016/12/07 09:31

そのコードだけ見せられてもどうにもしようがないです。 質問文に追記する形で全体像を見せてください。 そのコードがControllerに書かれているのかModelなのか等も不明ですので。
yuki84web

2016/12/07 10:09

ソースコードを追記しました。 画面からはangularJSで呼ばれています。
guest

0

自己解決

解決しましたので対策方法を書いておきます。

php

1function download_ajax(){ 2 $this->download(WWW_ROOT.'application'.DS.'hogehoge.docx'); 3} 4function download($file_path) { 5 $this->autoRender = false; 6 $content = 'attachment;'; 7 //$content .= 'filename='.'ほげほげ.docx'; 8 $content .= 'filename*=UTF-8\'\''.rawurlencode('ほげほげ.docx'); 9 $this->response->header('Content-Disposition', $content); 10 $this->response->file($file_path); 11 return $this->response; 12}

attachmentにエンコードしないファイル名も連結すると
2つ連結したファイル名になってしまう現象が発生しました。

以下、動作確認結果です。
Edge:OK
IE11:OK
Chrome:OK
Firefox:OK
Mac Safari:unknown(未検証)
iOS Safari:NG(ダウンロードが始まらない ※iOSの仕様上無理そう)
Android Chrome:OK

投稿2016/12/08 04:45

yuki84web

総合スコア1857

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問