• ベストアンサー

PHPでgz形式のファイルをダウンロード→解凍出来ない

こんにちは。ブラウザからリクエストがあった際に、 ローカルに保存されているgzip形式で圧縮した XMLファイルをPHPで読み込んで ダウンロードさせる、というプログラムを作成しております。 ダウンロードした後、解凍しようとすると 「破損ファイルです」とのメッセージが出て 解凍が出来ません。 ダウンロードしたファイルをバイナリエディタで開いてみると、 先頭に"0A"、 末尾に"0A090A" というゴミ?なんでしょうか、変なものが付いています。 (これが何かは調べても分かりませんでした。 また、このゴミを削除すると解凍出来ました) ローカルに保存したファイル、及び、PHP内の読み込みまではゴミは付いていませんでした。 //ソース抜粋 header('Content-Type: application/gzip;'); header('Content-disposition: attachment; filename=hogexml.gz'); $fp = fopen('/home/hoge/hogexml.gz', 'rb'); $str = fread($fp, filesize('/home/hoge/hogexml.gz')); $echo $str; //この時点でbin2hex()で$strをダンプしてもゴミは付いていない fclose($fp); ファイルはEUC-JPでDBから取得した文字列をUTF-8に変換してから圧縮して作成しております。 圧縮関数はgzopen(),gzwrite(),gzclose()です。 またブラウザからhttp://hogehoge_arienai.com/hogexml.gzという様に ファイルを直接指定してダウンロードした場合は問題なく解凍されました。 八方塞がり状態でどうしたら良いものかと・・(´△⊂)・. こういった現象にちょっとでも心あたりのある方おられましたら ヒントでも構いませんので、何卒ご返答の程よろしくお願い致しますす。 <PHPスクリプトの動いているサーバ> OS:FreeBSD6.1 Apache:2.0.58 PHP:5.1.2 <ダウンロードしているクライアント> WindowsXP Pro

noname#92546
noname#92546
  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答No.1

意外にLhacaでは解凍出来ず、解凍レンジだと解凍できる なんてことがあったりします。 0Aは改行コード 09はタブということから、出力時に改行やタブが混じってるのだと思います。 良く ?> とPHPを閉じた後に改行を書いてたりすると発生するので確認してみてください。 #質問の意図を汲み違えてたらごめんなさい。

noname#92546
質問者

お礼

おっしゃる通りでした!○| ̄|_ PHP初心者っぷりを発揮してしまいました・・・・ 改行を取ったら問題なくダウンロード出来ました。 #質問の意図を汲み違えてたらごめんなさい。 ご指摘通りの意図です。 「コードじゃなくてもっと上位のレイヤの問題?」とか 一人考えていた自分が恥ずかしいです、、、、 質問して良かったです。 どうもありがとうございました!

その他の回答 (1)

回答No.2

<?php の前、一行目等に改行コードなどありませんか? #1さん指摘の通り、ASCII文字で言えば、OAは改行コード(LF/NL)、09は水平タブ(HT)です。

noname#92546
質問者

お礼

もう全くもってソレでした!(´△⊂)・. スクリプトの先頭と最後にヘンなゴミを自分で入れていました・・・ PHPファイル自体が出力対象となる事に気がつきませんでした。 (あああ痛い初心者orz) ご指摘感謝です! どうもありがとうございました。

関連するQ&A

  • tar.gzファイルの解凍

    FreeBSDを使用しています。 ダウンロードした AAA.tar.gz というファイルを解凍したいのですが、 gunzip AAA.tar.gz とすると、 gunzip: AAA.tar.gz: not in gzip format と出ます。 そこで、 file AAA.tar.gz とすると、 AAA.gz: GNU tar archive と出ました。 ですので、 tar xzvf AAA.tar.gz としてみましたが、以下のように出ます。 gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error exit delayed from previous errors どのようにして解凍すればよいのかご教授いただけませんでしょうか?よろしくお願いいたします。

  • tar.gzファイルが解凍できない

    さくらのレンタルサーバでCakePHPを動かそうとしています。 http://www.cafechantant.com/blog/2007/09/17/%E3%81%95%E3%81%8F%E3%82%89%E3%81%A7-cakephp/ こちらのサイトを参考にさせていただいて、wgetでcake_1.1.17.5612.tar.gzをダウンロードするところまでできました。 %tar zxvf cake_1.1.17.5612.tar.gz とすると Unrecognized archive format: Inappropriate file type or format と出ます。 %gzip -d ./cake_1.1.17.5612.tar.gz とすると、 %gzip: ./cake_1.1.17.5612.tar.gz: not in gzip format と出ます。どうすれば解凍できるでしょうか。

  • PHPによるファイルのダウンロード

    初めまして最近ちょっとはまってしまっているので分る方がいましたらアドバイスお願いします。 PHPのheader関数を使ってブラウザのダイアログを表示させるファイルのダウンロードを実装した際に、ファイルサイズが大きいものをダウンロードしているとダウンロードが完了するまで他のアクセスが応答しなくなる場合があります。 基本的には $fp = fopen($filePath, "rb"); $contents = fread($fp, filesize($filePath)); fclose($fp); $len = strlen($contents); header("Content-type: application/octet-stream"); header('Content-disposition: inline; filename="' . $filename . '"'); header("Content-length: " . $len); echo $contents; というような一般的な書き方をしています。 ファイルのサイズ的には10MB前後です。 同じような現象を解決された方がいましたらアドバイス頂けると幸いです。

    • 締切済み
    • PHP
  • PHPでの複数ファイル出力

    よろしくお願いします。 複数の文字列を作成し($str_abc,$str_123)、それを元にファイルを作って、画面上に「開く、保存、キャンセル」のファイル出力ウインドウを出したいと思います。 ひとつだけなら、問題なくでるのですが、以下のように二つ一度に出したい(ファイル出力ウインドウが2つ)のですが、うまく出力することが出来ません。 どのようにやったら複数のファイルを一度に出すことができるのでしょうか。 <?php $str_abc = "<html><body>abc</body></html>"; $str_123 = "<html><body>123</body></html>"; //$str_abcを元にabc.htmlをつくる $fp = fopen("abc.html", 'w'); fwrite($fp,$str_abc); $fp = fopen("abc.html",'r'); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"abc.html\""); fpassthru($fp); //$str_123を元に123.htmlをつくる $hp = fopen("123.html", 'w'); fwrite($hp,$str_123); $hp = fopen("123.html",'r'); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"123.html\""); fpassthru($hp); ?> よろしくお願いします。

    • 締切済み
    • PHP
  • PHPでのファイルのダウンロードについて

    お世話になります。 タイトルのとおりPHPでファイルのダウンロードを行いたいのですが、 ファイルを保存するというダイアログが出てくれません。 tesuto.php <?php $file="/work/tesuto.csv"; header ("Content-Disposition: attachment; filename=$file"); header ("Content-type: application/x-csv"); readfile ($file); ?> tesuto.phpを実行するとダウンロードされずに、ファイルの中身が表示されてしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • .tar.gzダウンロードの挙動

    HTMLに<a>タグで.tar.gzファイルへのリンクを掲載しています。 このファイルのダウンロード時、挙動が異なります。 1)リンククリックでダウンロードすると、.tar(アーカイブ)のファイルサイズになる  (Chrome、Edgeの場合。Firefoxでは、.gz(圧縮)のファイルサイズになる) 2)右クリックでコンテキストメニューの「名前を付けてリンク先を保存」でダウンロードすると、Chrome、Edge、Firefoxいずれも.gzのファイルサイズになる。 このHTMLは、同じものを別々のサーバに置いています。 サーバAはApache2.4.53、サーバBはApache2.4.54です。 1)、2)の事象は、サーバAで起きるのですが、サーバBでは、いずれも.gzのファイルサイズでダウンロードできます。 ちなみにレンタルサーバなので、httpdconfの編集は出来ないので、httaccessに以下を追記しています。(サーバA、B共に同じもの) AddEncoding x-gzip .tar.gz .gz .tgz AddEncoding x-identity .tar.gz .gz .tgz AddType application/x-gzip .tar.gz .gz .tgz 1)、2)は、Apacheのバージョンによるものなのでしょうか? サーバAでも、リンククリックで.tar.gzの状態でダウンロードできるようにしたいので、質問させていただきます。

  • 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で複数ファイルのダウンロード

    はじめまして、PHPについて質問させていただきます。 PHPでファイルを複数ダウンロードできるようしたいと思っています。 色々調べ、header関数を使用し、以下のように記述すると ファイルのダウンロードは成功しました。 /*****************************************/ // ダウンロードさせる元ファイル(絶対パス) $filepath = 'test_01.pdf'; // 保存時のファイル名(デフォルト) $filename = 'download001.pdf'; // HTTPヘッダ送信 header("Content-length: " . filesize($filepath)); header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=\"{$filename}\""); // ファイルを読み込んで出力 readfile($filepath); /*****************************************/ 一つのファイルのダウンロードに成功したので、 次に複数のファイルを順番にダウンロードをさせる為にループ処理をしました。 /*****************************************/ //配列 複数ファイル $downfile = array("test_01","test_02","test_03"); //データ数 $max = count($downfile); // ダウンロードさせるディレクトリ(絶対パス) $filepath = "/home/sites/www.eshop-himawari.com/web/test_nihon/form_down/file/"; // 保存時のファイル名(デフォルト) $filename = "download"; $filetype = ".pdf"; $kazu = 1; //ループ処理 for( $i = 0; $i < count( $max ); $i++ ){ $downpath = $filepath.$downfile[$i].$filetype; $filename = $filename.$kazu.$filetype; $kazu = $kazu++; // HTTPヘッダ送信 header("Content-length: " . filesize($downpath)); header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=\"{$filename}\""); // ファイルを読み込んで出力 readfile($downpath); // $fp = fopen( "$downpath", "rb" ); // @fpassthru( $fp ); } /*****************************************/ しかし実行すると最初のファイルはダウンロードしますが 2つ目からのファイルはダウンロードされませんでした。 きちんとループ処理をされて、2つ目以降のファイルをダウンロード するには、どうすればいいのでしょうか?

    • 締切済み
    • PHP
  • 拡張子tar.gzの解凍

    ユニックスで作ったファイルを圧縮して、私のウィンドウズへメールで送ってくれたのですが、拡張子がtar.gzとなっていて、Lhasaと+Lhacaは持っているのですがどちらででも開けませんでした。 検索したら同じような質問もあって参照してみたのですが、どの解凍ソフトが良いのかも分からず、これかと思われる解凍ソフトをダウンロードしてもその使い方がわからなかったりでとても困っています。 +Lhacaでも解凍できると書いている方もいたのですが、私の場合圧縮になってしまいました。 難しいことは良く分からないので、どなたか分かりやすく教えていただけないでしょうか? ちなみにウィンドウズXPを使っています。

  • PHPでダウンロードしたファイルが0kbになる

    いつもお世話になります。 表題のとおり、 PHPでサーバー上の画像や動画のファイルをダウンロードしローカルに保存したいのですが、 ダウンロードはできるのですがファイルの中身が空になってしまいます。 特に動画の場合は 「ファイルを再生できません。プレーヤーがそのファイルの種類をサポートしていないか、そのファイルの圧縮に使用したコーデックをサポートしていない可能性があります。」 というメッセージが出ます。 ファイル形式は画像はjpg、動画はwmvで試しました。OSはwindows7です。 ブラウザはクローム、サファリ、IEで試しましたが結果は一緒でした。 プレーヤーは入っていて、ffftpでサーバーのファイルをクリックすると正しく開きます。 以下がソースになります。 <?php // ダウンロードさせる元ファイル $fullpath = 'http://www.ドメイン/パス/logo.jpg'; // 保存時のファイル名(デフォルト) $filename = 'logo.jpg'; // HTTPヘッダ送信 header("Content-type: image/jpeg"); header("Content-Disposition: attachment; filename=$filename"); //ファイルサイズ進捗表示 header('Content-Length: '.filesize('$filename')); // ファイルを読み込んで出力 readfile($fullpath); ?> 以上です。 ダウンロードされるファイル名は正しい(この場合logo.jpg)ものがダウンロードされます。 間違っている箇所、追加or削除したほうがよいコードなどございますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう