アプリ版:「スタンプのみでお礼する」機能のリリースについて

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を使用しています。

A 回答 (1件)

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



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

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

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

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

>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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!