Excelファイルのダウンロードと表示に関する問題

このQ&Aのポイント
  • サーバーに配置してあるExcelファイルをダウンロードすると、ファイルを開こうとする際にエラーメッセージが表示されます。表示されるポップアップには、「ファイルの形式が異なるため確認が必要」という内容が書かれています。また、実際にファイルを開くと文字化けが発生します。
  • 原因として、ダウンロードしたExcelファイルの形式が破損している可能性が考えられます。
  • 対策として、ファイルの形式が正常であることを確認し、信頼できる発行元からのファイルであることを確認してから開く必要があります。また、ダウンロードする際には注意が必要です。
回答を見る
  • ベストアンサー

excelファイルのダウンロード

サーバーに配置してある、excelファイルをダウンロードさせ、 ダウンロードしたファイルを開こうとすると 「開こうとしているファイル 'xxxxxxxx' の形式は、ファイル拡張子が示す形式と異なります。 このファイルを開く前に、ファイルが破損していないこと、信頼できる発行元からのファイルであることを確認してください。 ファイルを今する開きますか? 」 というポップアップが表示され、「はい」をクリックして表示すると文字化けしています。 ソースは以下のように書いています。 どこが問題なのか、教えていただければと思います。 よろしくお願いします。 $file = excelファイルのフルパス header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=sample.xls'); header('Content-Transfer-Encoding: binary'); header('Content-Length:' . filesize($file)); header('Pragma: no-cache'); header('Cache-Control: no-cache'); readfile($file);

  • PHP
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.2

ここに書かれていない部分で、何か出力しちゃってるんでしょうね。 PHPファイルの先頭1文字目から <?php が書かれていて、最後の ?> は省略していますか? コードの他の部分で何か出力していませんか? PHPを通さず、そのファイルをURLを指定して直接ダウンロードしてみるとどうですか?(一時的にでもURLのある場所に移す)

shaka001
質問者

お礼

回答ありがとうございます。 直接、aタグのリンクに指定してやると問題なくダウンロードされました。 他の部分で出力がないか確認してみます。

その他の回答 (2)

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.3

>>2 なるほど、その可能性が高そうな気がしますね。 すべてのリターンの前に、<html><head>~</head>やらを吐き出すように書いてるとか、<!doctype~>やらかも知れませんね。 末尾に、『ダウンロードが完了しました』なんてメッセージを出力しようとしている可能性も。 CMS使ってたら、このコードに行きつく前にCMSが吐き出してしまっているかも知れませんし、このコードの後かもしれませんね。 もちろん、#2さんのおっしゃる通り、"<?php"の前の空白や改行、"?>"の後の空白や改行なども充分に怪しいですね。 つーか、ファイルに直接ハイパーリンクを設定しておけば、ファイルをダウンロードするダイアログ出ませんでしたっけ? IEだとIE内で開こうとしてしまう、とかそんな事があったかな? xlsを圧縮せずにサーバーに置こうと思った事がないので、その辺がよく判ってないな。

shaka001
質問者

お礼

回答ありがとうございます。 なるほど、zipにするという手がありましたね。 さっそく試してみます。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

直接関係はないですが、私ならzipかlha(lzh)形式のどちらかで圧縮しますね。 万一途中でバイトコードが化けてしまったら、解凍時点で判明しますからね。 解凍できないというエラーによって。 それと、xlsにはプログラム(VBA)が埋め込めますからね。たぶんないとは思いますが、通信経路上に悪意のあるコードを埋め込むようなウィルスが感染しているなんて事が、あり得ないとも言い切れない。 拡張子xlsのままだと、契約プロバイダやらプロキシ、ウィルスバスターなんかが安全の為にダウンロードを停止させないとも限らない(ウチの会社のプロキシは実際にブロックしますしね)。 もし、そのままxlsでなくてもいいのなら、解凍の際にバイトコードが化けていないと判断できるように、圧縮してみては?

関連するQ&A

  • fileのダウンロードとページ移動を続けて行うには?

    初心者です。教えて頂けますか? フォームのボタンを押したらダウンロードする様に作りました。 ボタンを押したらダウンロードとページ移動を続けて行うには どの様にすれば良いでしょうか? header( "Content-Type: application/octet-stream" ); header( "Content-Disposition: attachment; filename=$contentFilePath" ); header( 'Content-Length: '.filesize($contentFilePath) ); readfile($contentFilePath);

    • ベストアンサー
    • PHP
  • PHPでのファイルダウンロードについて

    初めて質問させていただきます。 社内用でファイルのアップロード・ダウンロードができるシステムを開発しています。 PCからは問題なくアップロードもダウンロードも行えていたのですが、 スマホからアクセスしてダウンロードをすると失敗してしまいます。 下記のコードを使ってます。 ファイルの種類はいろいろなので、「application/octet-stream」にしてます。 が、それぞれのファイルタイプに合わせて変更させても状況は変わりませんでした。 -- header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$file_name.'"'); header('Content-Length: '.filesize($dl_file)); readfile($dl_file); exit; -- なにか解決策があるようでしたら、教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • move_uploaded_fileでアップロードしたファイルのダウンロード・解凍

    move_uploaded_fileでzipファイルをアップロードし、 chmodでパーミションを0777に変更しました。 この状態で、直接ファイルを指定すれば、普通にダウンロード・解凍できるのですが、 このファイルを別プログラムから、 header('Content-type: application/octet-stream'); header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); header('Pragma: no-cache'); header('Content-Disposition: attachment; filename="ファイル名"'); header('Content-Length: ファイルサイズ'); としてfpassthruで開くと、ダウンロードはできますが、解凍ができません。 しばらく考えているのですが、解決できず…。 宜しくお願いします。

    • 締切済み
    • PHP
  • ダウンロードさせると*.phpにリネームされてしまう。

    phpでファイルのダウンローダを作成したのですが、IEで動かすと*.phpと動作しているphpのスクリプトネームにリネームされてしまいます。 FireFoxではリネームされる事無くダウンロードされるのですが、IEでの解決方法をご存知の方、どうぞご教授くださいませ。 コードは $filesize=filesize($filedldir); header ("Accept-Ranges: none"); header ("Content-Length: $filesize"); header ("Content-Type: application/octet-stream"); header ("Content-Disposition: attachment; filename=$fnames"); readfile ($filedldir); exit; といった感じです。 何がおかしいのでしょうか?

    • ベストアンサー
    • PHP
  • 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を使用しています。

    • ベストアンサー
    • PHP
  • 複数ファイルのダウンロード

    PHPで複数のログファイルをダウンロードしたいときはどのようにしたらよいのでしょうか? ログファイルは下記のような形式です。 test_20041001,test_20041002,・・・,test_2004_1031 以前までは、DBから取得したデータをタブ区切りで表示したものを .xlsファイルでダウンロードしていました。 そのときのやり方としては、 //---------------------------------- //ファイルダウンロード //---------------------------------- $fSize = $Sec->getFileSize(ADMIN_RESERVECSV_PATH); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . PATH); header("Content-Length: " . $fSize['B']); readfile(PATH); というような方法です。

    • 締切済み
    • PHP
  • PHPでバックアップ

    PHP初学者です、よろしくお願い致します。 PHPでバックアップを取りたく、次の様にしてみたのですが、実行するとファイルは正しいサイズでダウンロードされるのですが解凍すると中身は空になっています。できたファイルをFTPで別途ダウンロードして解凍してみると正常です。 $file = $storedir.$generatefile; $tstr = 'tar -C '.$upperdir. ' -czf '.$storedir.$generatefile.' '.$targetfolder; $result = system($tstr, $retval); if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); } ファイルが出来上がっていないのにダウンロードが始まってしまうからでしょうか?もしそうならファイルが出来上がってからダウンロードが始まるようにするにはどうしたら良いでしょうか? 根本的にやり方が良くないようでしたらそれもご指摘いただければありがたいです。よろしくお願いいたします。

    • 締切済み
    • PHP
  • IE6でダウンロードさせたい【PHP】

    IE6でダウンロードさせたい【PHP】 現在、PHPからのヘッダ出力を使って ファイルダウンロードさせるプログラムを作成しています。 (PHPスクリプトが呼ばれると、 ダウンロードダイアログが出現する) FireFoxでは問題なく動作するのですが、 IE6だと動作しません。(ダイアログが出ない) ※ちなみに、SSLは使ってません。 --↓ソース------------------- header("Content-Disposition: inline; filename=\"".basename($path_file)."\""); header("Content-Length: ".$content_length); header("Content-Type: application/octet-stream"); readfile($path_file) ---------------------------------- -IE6のHTTPヘッダ(デバッガで抽出)-- HTTP/1.1 200 OK Date: Thu, 20 May 2010 07:35:19 GMT Server: Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9 X-Powered-By: PHP/5.2.9 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Disposition: inline; filename="20100520_133719_irai_1.txt" Content-Length: 2415 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: application/octet-stream ---------------------------------- どなたか解決策に心当たりのある方、ご教授宜しくお願いします!

    • ベストアンサー
    • PHP
  • ファイルのダウンロードについて

    いつもお世話になっております。 ファイルのダウンロードについて質問です。    header('Content-Type: image/jpeg'); header('Content-Length: '.filesize($fpath)); header('Content-disposition: attachment; filename="'.$fname.'"'); readfile($fpath); headerを使っています。 ダウンロードしたいファイルは jpg,pdf,xls,xlsx,doc,ppt,などですが それぞれ Content-Type は 拡張子 xlsなら  header('Content-Type: application/vnd.ms-excel'); にと 変更しております。 エクセルを ダウンロードしますと、 「開こうとしているファイルは実際にはその拡張子が示すファイル形式ではありません。 このファイルを開く前にファイルが破損していないこと、信頼できる発行元からの ファイルであることを確認してください。ファイルを今すぐ開きますか?」 とメッセージが出てきて、「はい」とすると 文字化けしたエクセルが開きます。 ワードですと、開いて修復しますかとエラーが出た後 ⇒OK⇒ 正しく開けます。 PDFだと 問題なく開きます。 エクセルとワードは 下記のように書きますと <a href='files/ファイル名' target='_blank'> 正しく開くことができますが、この方法だと ダウンロードするファイル名を 変更できませんので、使うことができません。 上記のエラー解決方法はありますでしょうか。 また header 以外の方法で ファイル名を変更して ダウンロードする方法が ありましたら 教えていただけませんでしょうか。 情報不足でしたらすみません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • IEだと・・・だめなんです

    Zipファイルに固めてダウンロードさせようとしているのですが、Firefoxだとダウンロードできて、IEだとエラーが出てこけてしまいます。 まず、Header部分が原因だと思うのですが、原因分かる方いらっしゃいますか?教えてください。 header("Content-type: application/octet-stream"); header('Content-Disposition: attachment; filename="' . zip_file_name . '"'); header("Content-length: " . filesize($zip_file_name)); readfile($zip_file_name);

    • ベストアンサー
    • PHP

専門家に質問してみよう