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

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

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

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

CakePHP

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

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

Q&A

2回答

2432閲覧

Safariでダウンロードすると[.html]が付けられてしまう

Rebecca

総合スコア11

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

CakePHP

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

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

0グッド

0クリップ

投稿2019/11/25 07:04

編集2019/12/09 09:05

更新失敗していたようで、失礼しました。再度記載し直します。

cakePHP 2.xで開発中です。

アップロードしたファイルをダウンロードする機能があり、Safariでダウンロードすると、ファイル名最後に[.html]が追加されてしまいます。

例えば、アップロードしたMS Wordファイル「xxx.docx」をダウンロードすると
「xxx.docx.html」 となります。

ファイル名から[.html]を削除するとMS Wordファイルとして開くことができます。
Chromeでは、正常に「xxx.docx」がダウンロードできます。

前提・実現したいこと

SafariでもChromeと同様にファイルをダウンロードできないでしょうか?
ご教唆ください。

以下、現状のソースです。

cakePHP

1$file_path = [サーバ上のディレクトリ/ファイル名]; 2$file_name = 'ほげほげ.docx'; 3 4//ダウンロード処理 5$headers = [ 6 'Content-Type: application/octet-stream', 7 'Content-Disposition: attachment; filename="'.$file_name.'"', 8 'Content-Length' => filesize($file_path) 9]; 10$this->response->header($headers); 11$this->response->file($file_path, array('download' => true)); 12 // $file_pathのファイル名をダウンロードファイル名にしてダウンロード 13 $this->response->download($file_name);

以下、やってみたこと

cakePHP

1$file_path = [サーバ上のディレクトリ/ファイル名]; 2$file_name = 'ほげほげ.docx'; 3 $this->response->header('Content-Type: application/octet-stream'); 4 $content = 'attachment;'; 5 $content .= 'filename='.$file_name; 6 $content .= ' filename*=UTF-8\'\''.rawurlencode($file_name); 7 $this->response->header('Content-Disposition:', $content); 8 $this->response->file($file_path); 9 // $file_pathのファイル名をダウンロードファイル名にしてダウンロード 10 $this->response->download($file_name);

補足情報(FW/ツールのバージョンなど)

Mac OS Mojave バージョン 10.14.6
Safari バージョン13.0.3
Vagrant + CentOS6.x
cakePHP2.x

追記 PHPでやってみました

PHP

1<?php 2$file_path = [サーバ上のディレクトリ/ファイル名];; 3$file_name = 'ほげほげ.docx'; 4 5// HTTPヘッダ設定 6header('Content-Type: application/octet-stream'); 7header('Content-Length: '. filesize($file_path)); 8//header('Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($file_path)); 9//ダウンロードの指示・ダウンロード時のファイル名を指定 10header('Content-Disposition: attachment; filename="'.$file_name.'"'); 11 12// ファイル出力 13readfile($file_name); 14?>

ファイル「ほげほげ.docx」がダウンロードされ、 MS Wordで開くことができました。

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

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

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

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

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

m.ts10806

2019/11/25 07:51

これだけ書かれても誰も再現できないし情報が少なすぎるので答えようがないです。
m.ts10806

2019/11/25 08:20

これだけでも誰も再現できませんよ。$this->responseとかはフレームワークが保有するものなのでともかく、唐突に出てくる変数の正当性が判断できません
Rebecca

2019/11/25 08:22

そうなのですか。。。 Chromeでは正常に動作する前提でもだめでしょうか。。。 response モジュールを掲載する必要がありますか?
FKM

2019/11/25 08:26

そのWEBサーバー上で、cakePHP2ではなく、普通にPHPでベタ書きした場合でもSafariで同じ挙動をするか確かめてみてください。
miyabi_takatsuk

2019/11/25 08:46

https://teratail.com/questions/35336 こちらで解決しないでしょうか? ちなみに、”php safari ダウンロード html”の検索ワードで、一発目で出たページです。 (teratailの蓄積が半端ない)
m.ts10806

2019/11/25 09:15

$file_nameとか$contentとか$file_pathに何が入っているか質問者さんしか知らないという指摘をしています。
Rebecca

2019/11/25 09:33

miyabi_takatsuk 様 こちらはもちろん試しましたがダメでした。
Rebecca

2019/11/25 09:38 編集

m.ts10806 様 chromeで動作するし、cakePHPで調べていて共通のやり方なのかな、と思っていたので主要部分のみにしていました。変数値については本文に追記しました。よろしくお願いします。
m.ts10806

2019/11/25 10:43

「もちろん試しました」と言われてもこの質問内容のどこでそれがわかりますか?
Rebecca

2019/11/26 01:51

FKM 様 PHPベタ書きで実行したところ、正常でした。(本文に追記) cakePHPの $this->response->file($file_path); で問題が起きているのでしょうか。 ``` $this->response->file($file_path, array( 'name'=>$file_name, 'download' => true)); ``` 全て記述しても変化はなく、他に制御できるものがあるのでしょうか。
FKM

2019/12/09 10:29

header('Content-Length: '. filesize($file_path)); の部分の有無でしょうかね?まだ詳しくはわかりませんが。
guest

回答2

0

昔、CakePHPで作ったプログラムを見てみると、私は「自動レンダリングの停止」というのを行っていました。

PHP

1$this->autoRender = false;

このautoRender、何をしているのか忘れてたので検索してみると、Qiitaに例がありました。
【CakePHP】ファイルダウンロード

ご査収くださいませ。

投稿2019/12/09 09:26

XNXSXMXR

総合スコア239

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

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

Rebecca

2019/12/19 06:34

XNXSXMXR 様 ありがとうございます。 諦め気味に放置していましたが、再度時間があったので参照先を真似して試してみました。 いろいろ記述も変え試したのですが、結果は変わらず、「ほげほげ.docx.html」がダウンロードされるばかりでした。 ``` $file_path = [サーバ上のディレクトリ/ファイル名]; $file_name = 'ほげほげ.docx'; $this->autoRender = false; $headers = [ 'Content-Type: application/attachment', 'Content-Disposition: attachment; filename="'.$file_name.'"', 'Content-Length' => filesize($file_path) ]; $this->response->header($headers); $this->response->file($file_path, array('download' => true)); ```
guest

0

これじゃないですか?
// レスポンスオブジェクトを返すとコントローラがビューの描画を中止します
return $this->response;
公式ドキュメント
https://book.cakephp.org/2/ja/controllers/request-response.html

投稿2019/12/09 02:06

jkl

総合スコア6

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

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

Rebecca

2019/12/09 09:03

jkl様 以下のように最後に追加してみたところ、 ``` $this->response->download($file_name); // レスポンスオブジェクトを返すとコントローラがビューの描画を中止します return $this->response; ``` ダウンロードファイル名は、変わらず『ほげほげ.docx.html』で[.html]を削除し『ほげほげ.docx』はMS Wordでひらけますが中身が空っぽでした。 むしろ状況は悪化です(TT) 「ビューの描画を中止」とはそういう意味でしょうか。...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問