こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPでファイルのダウンロードすると開けません。

PHPでファイルのダウンロードすると開けません。

文書を整理するために、アップロードして、必要に応じてダウンロードする仕組みを作っています。

PDFや画像のファイルは問題ないのですが、、
word文書(エクセルもダメでした)を、以下のファイルを作って、ダウンロードし開こうとすると

「ファイル******.docxは無いように問題があるため、開けませんでした。」となります。
※エクセルでは、「Exelで****.xlsxを開くことが出来ません。ファイル形式またはファイルか拡張子が正しくありません。ファイル拡張子とファイル形式が一致していることを確認してください」
 とダイアログが出てきます。

$file="アップロードしてある実ファイル名";
$file_name="ローカルに保存する際のファイル名";

※ファイル名を変更しなくても同じなので、そこは関係ないと思います。

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=$file_name");
header('Content-Length: '.filesize('$file'));
readfile($file);


リンクを張って開くのには何の問題もありません。
<a href="http://www.******.com/images/$file">$file_name</a>

ダウンロードする際に名前を変更したいので、ダウンロード用のファイルを作ってダウンロードさせようとしています。

何か、ダウンロードをする前に処理が必要なのでしょうか?

よろしくご教授お願いいたします。


※ワード、エクセルは2010を使用しています。

投稿日時 - 2013-07-24 13:44:06

QNo.8189772

困ってます

質問者が選んだベストアンサー

>header('Content-Length: '.filesize('$file'));

これってシングルクォーテーションで変数囲むと展開されないので
ファイルサイズが0になりませんか?
filesize($file)ないしfilesize("$file")

ダウンロードされたファイルサイズと本来のファイルサイズを比べてみてください

またその他、ファイル名を英数のみにしてみるとか
readfileのように中途半端な関数を利用せずにきちんとファイルI/Oしてやる
などで改善する可能性はあります

投稿日時 - 2013-07-24 14:09:27

お礼

ありがとうございました。

>header('Content-Length: '.filesize('$file'));

は、header("Content-Length: ".filesize($file));に変更いたしました。

それから、ファイルのサイズを見ると「0」ではないのですが、
少し違っていました。

(86,993 バイト)正しいファイル
(87,655 バイト)ダウンロードファイル

>readfileのように中途半端な関数を利用せずにきちんとファイルI/Oしてやる

これが、どのようにしたら良いか判らず調べていたら
出力用バッファをクリアするとうまく行くとありましたので試してみた所、改善いたしました!

以下の様に書き換えをいたしました。

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Length:".filesize($file));
ob_end_clean();
readfile($file);

これで、思った通りの事が実現できました。

ありがとうございました。

投稿日時 - 2013-07-24 15:19:49

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問