• 締切済み

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); } ファイルが出来上がっていないのにダウンロードが始まってしまうからでしょうか?もしそうならファイルが出来上がってからダウンロードが始まるようにするにはどうしたら良いでしょうか? 根本的にやり方が良くないようでしたらそれもご指摘いただければありがたいです。よろしくお願いいたします。

noname#207939
noname#207939
  • PHP
  • 回答数1
  • ありがとう数3

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

なぜ >ob_clean(); >flush(); しているの? それとreadfileはバイナリセーフではないのでは?

noname#207939
質問者

お礼

Zend FrameWorkでsmartyを使用していたため、ダウンロードされるファイルの頭にページ情報がくっついていました。次の様にして正しいファイルを得られました。お騒がせいたしました。 $file = $storedir.$generatefile; $tstr = 'tar -C '.$upperdir. ' -czf '.$storedir.$generatefile.' '.$targetfolder; $result = system($tstr, $retval); if (file_exists($file)) { $response = $this->getResponse(); $response->setRawHeader('Content-Description: File Transfer'); $response->setRawHeader('Content-Type: application/octet-stream'); $response->setRawHeader('Content-Disposition: attachment; filename='.basename($file)); $response->setRawHeader('Content-Transfer-Encoding: binary'); $response->setRawHeader('Expires: 0'); $response->setRawHeader('Cache-Control: must-revalidate, post-check=0, pre-check=0'); $response->setRawHeader('Pragma: public'); $response->setRawHeader('Content-Length: ' . filesize($file)); $response->setBody(file_get_contents($file)); $response->sendResponse(); }

noname#207939
質問者

補足

コメントありがとうございます。 http://php.benscom.com/manual/ja/function.readfile.php からコピーした物で、これが問題を起こしているのでしょうか? readfile以外に方法がありますでしょうか?(調べてみます。)

関連するQ&A

  • ダウンロードさせると*.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
  • 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
  • jpeg画像を開かずダウンロードしてもらうには

    現在製作しているサイトで、写真素材(jpeg画像)を配布するのですが、対象のファイルをダウンロードしてもらう際に、「右クリックで保存してください」ではなく、クリックしたら保存のダイアログが出てくるようにしたいと思い、調べた結果、以下のページを見つけました。 http://code.nanigac.com/source/view/461 http://www.abe-tatsuya.com/web_prog/perl_cgi/content_disposition.php 上記サイトを参考にして(PHP)、思っていたことが実現できたのですが、1つ問題が発生しました。 ダウンロードしたjpegファイルが、「Windows画像とFAXビューア」で「プレビューできません」となってしまいます。 原因にお心当たりがあればご教示いただけると助かります。 ・photoshopでは問題なく開けました。 ・上記スクリプトを使わずにファイルを右クリックで保存した場合は問題なく画像がプレビューできます。 ・ファイルを右クリックで保存した場合の方が、ファイルサイズが微妙に小さくなります。 現在、以下のように書いております。 $file_length = filesize($file); header("Content-Type: image/jpeg"); header("Content-Disposition: attachment; filename=".basename($file)); header("Content-Length:$file_length"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); header("Pragma: private"); readfile ($file);

    • ベストアンサー
    • 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
  • Zend Framework で大きなファイルをダウンロードしたい

    ホームページをtarでバックアップしてZend Frameworkでダウンロードしたいのですが、 http://php.benscom.com/manual/ja/function.readfile.php を参考に次の様にしてみたところ、数Mbyte程度のファイルはダウンロードできましたが大きなファイル(200Mbyte)ではエラーになりました。 public function DownloadAction(){ $file = "test.bin"; $this->_helper->viewRenderer->setNoRender(); $response = $this->getResponse(); $response->clearAllHeaders(); $response->clearBody(); $response->setRawHeader('Content-Description: File Transfer'); $response->setRawHeader('Content-Type: application/octet-stream'); $response->setRawHeader('Content-Disposition: attachment; filename='.basename($file)); $response->setRawHeader('Content-Transfer-Encoding: binary'); $response->setRawHeader('Expires: 0'); $response->setRawHeader('Cache-Control: must-revalidate, post-check=0, pre-check=0'); $response->setRawHeader('Pragma: public'); $response->setRawHeader('Content-Length: ' . filesize($file)); $response->sendHeaders(); $response->setBody(file_get_contents($file)); $response->outputBody(); } それで $response->setBody(file_get_contents(&$file)); $response->outputBody(); の部分を $handle = fopen($file, "rb"); $contents = ''; while (!feof($handle)) { $contents = fread($handle, 8192); $response->setBody($contents); $response->outputBody(); } fclose($handle); とかにしてみましたがこれもファイルが途中で切れてしまいました。 php.iniのメモリ量を増やす以外に、何か方法がありますでしょうか?

    • ベストアンサー
    • PHP
  • PHP 画像の表示

    プログラミング初心者です。 PHPでブラウザに画像を表示したいのですが映らなくて 以下のソースコードは間違っているでしょうか? <?php $fileName = "img/test.jpg"; //ファイル名 if (file_exists($fileName)) { header('Content-type: image/jpeg'); header('Content-Length: '.filesize("http://localhost:8080/test.jpg")); //あった方が良い readfile("http://localhost:8080/test.jpg"); //ファイルを読み込んで標準出力に書き出し exit; } ?>

    • ベストアンサー
    • 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
  • 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
  • PHP:wavファイルのダウンロード

    音楽ファイルを会員に配信するサイトを運営しています。 mp3は問題なくダウンロード・再生できるのですが、wavファイルはダウンロードしてもファイルが破壊されており、再生できません。 wavファイルのバイト数に変化はありませんでした。FTPからファイルをダウンロードすると正常に再生できるので、問題はウェブでのダウンロードをする過程にあることは分かっています。いろいろ調べているのですがそれ以降の原因が分からず困っています。 誰か原因をご存知の方、目星の付く方などおられましたら、ぜひ解答お願いいたします。 ファイルダウンロードには、以下のようなphp関数を使っています。 function download_file($path_file){ if (!file_exists($path_file)) { die("Error: No Such File."); } if (($content_length = filesize($path_file)) == 0) { die("Error: File size is 0.(".$path_file.")"); } if($_POST['sort'] == mp3){ header("Content-Type: audio/mpeg"); }elseif($_POST['sort'] == wav){ header("Content-Type: audio/x-wav"); } header("Content-Disposition: attachment; filename=\"" .basename($path_file)."\""); header("Content-Length: ".$content_length); header("Content-Transfer-Encoding: binary"); $handle = fopen($path_file, 'rb'); while (!feof($handle)) { echo fread($handle, 4096); ob_flush(); flush(); } fclose($handle); }

    • 締切済み
    • PHP
  • PHPでファイルダウンロードの上限

    PHPを使ってファイルをダウンロードするプログラムを書きました。 header()で最後にreadfile()で出力する流れですが、htaccessで 「upload_max_filesize」「post_max_size」「memory_limit」を600Mとしましたが、 PHPでダウンロード出来る容量が約100MB程度しかダウンロード出来ません。 色々と調べましたが原因が分かりません。 お分かりになる方、教えていただけないでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう