• ベストアンサー

zip ファイルの Content-Length

お世話になります。 zip ファイルの Content-Length が、取得できるものとできないものがあるのですが、これはなぜでしょうか? 1) http://example.com/hoge1.zip 2) http://example.com/hoge2.zip パケットキャプチャすると、1) のレスポンスには Content-Length が付与されており、2) にはされていません。 1) と 2) の zip ファイルの違いは、ファイルサイズだけです。 2) の zip ファイルは 18 MB 強あります。 どなたかご回答お願いします。

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

  • ベストアンサー
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.1

Webサーバの実装次第ですが、Content-Lengthはファイルサイズが大きい場合、 付与されないケースがあります。 http://www.studyinghttp.net/header#Content-Length を参照してください。 レスポンスデータのサイズが大きい場合、転送エンコーディングという方法で レスポンスデータが生成される場合があります。この場合、Content-Lengthは 付与されません。 また、転送エンコーディングを使用せず、Content-Lengthも付与されてない 場合は、コネクションが切断されるまでがレスポンスデータであるということに なっていますので、あらかじめレスポンスの全体サイズがわからないような場合は、 Content-Lengthを付与せず、コネクションの切断をもってレスポンスデータの終わり とする場合もあります。

Helter-H
質問者

お礼

丁寧な解説ありがとうございます。 申し遅れましたが Web サーバーは Apache 2.2.3, OS は CentOS 5.5 (64bit) です。 パケットキャプチャすると、Content-Length のみならず、レスポンスコードすら返ってきません。 (リンクをブラウザからたたいてファイルダウンロードした時 ファイル自体はダウンロードできます) ご教示いただいたリンク先を読んでみます。

関連するQ&A

  • iモードのcontent-lengthって??

    iモードのサイトを試しに作ってみたいのですが、 右記URL内中段にこのような記述がございました。http://www.nttdocomo.co.jp/service/imode/make/content/html/outline/s3.html 『CGI作成時に「Content-Type」、「Content-Length」は必須項目となります。』 また、違うサイトでは、 『サーバでは「Content-Length」の対応を必須としてください。万が一」、「Content-Length」のレスポンスを返さない場合、N902iX以降の端末では、500KB以上のコンテンツのDLが出来なくなります。』 とあります。 この 『「Content-Length」の対応』というのは、DLしている時に『現在何MBのファイルをDLしたか』というのを 画面上に表示させるためのものでしょうか? また、それ以前に、Content-Lengthというのは単純にファイルのサイズを記述しておけば良いのでしょうか? 分かる方、お願い致します!

    • ベストアンサー
    • HTML
  • header関数で出力するContent-Lengthが以下の条件では

    header関数で出力するContent-Lengthが以下の条件では0になってしまいます。 header("Content-Test: ".filesize("./data.dat")); header("Content-Length: ".filesize("./data.dat")); readfile("./data.dat"); なおかつ、data.datのサイズが2.6MB以上。 それぞれのバージョンは以下の通りです。 Apache 2.2.15 PHP 5.3.2 上の条件で、ヘッダを確認したらContent-Testはちゃんとdata.datのサイズが書かれて いるのですが、Content-Lengthが0になってしまいます。 readfileの行を削除して、実行してもContent-Lengthだけが0になってしまいます。 headerで指定したContent-Lengthをそのまま出力するにはどうしたら良いですか? ご存知の方がおられましたら、ご教示お願いいたします。

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

    下記のようなPHPスクリプトにおいて、zip フォルダに画像ファイルの圧縮ファイルを 保存し、ダウンロードしたいんです。ダウンロードの動作はChrome上で確認できてますが、圧縮した、ダウンロードファイルのサイズが0KB で、空なのです。 どこが間違っているか教えていただけますか? [file_zip.php] <?php mb_internal_encoding("UTF-8"); $ftp = ftp_connect("~"); ftp_login($ftp, "~", "~"); $dir = '/storage2/zip'; ftp_chdir($ftp, $dir); // ディレクトリ移動 // Zipクラスロード $zip = new ZipArchive(); // Zipファイル名 $zipFileName = $_POST['zip_filename']; var_dump($zipFileName); // Zipファイル一時保存ディレクトリ $zipTmpDir = '/storage2/zip'; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 echo '圧縮ファイルをオープンできませんでした'; exit(); } // ここでDB等から画像イメージ配列を取ってくる $image_data_array = array(); array_unshift($image_data_array, $zipTmpDir.$zipFileName); // 処理制限時間を外す set_time_limit(0); foreach ($image_data_array as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく unlink($zipTmpDir.$zipFileName); // header("Location: storage.php"); ?>

    • 締切済み
    • PHP
  • ZendFrameworkでファイルDLできない

    ZendFrameworkでZIP圧縮したファイルをダウンロードさせようとしていますが、ファイルが正常に解凍できません。 「CRCが一致しないか、出力先が使用中です」とエラー表示されます。 一応、エラーが表示されても解凍はするのですが、ファイルを開こうとすると”ファイルが壊れています”と出てしまいます。 ちなみに、そのファイルをFTPでダウンロードし、通常に解凍すると正常に解凍されるので、ZendFramework上の何らかの処理が原因であると思われます。 また、症状の出ているのは数MB程度のデータで、サイズの小さい数百k程度のデータには起こっていないようです。 public function downloadAction(){ $file = abcde.zip; // ファイル名 $path = "/home/public/files/" . $file; // ファイルパス $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($path)); $response->sendHeaders(); $response->setBody(ob_end_clean()); $response->setBody(flush()); $response->outputBody(); $handle = fopen($path, "rb"); $contents = ''; while (!feof($handle)) { $contents = fread($handle, 8192); $response->setBody($contents); $response->outputBody(); } fclose($handle); return; } 何が原因だか教えて頂けないでしょうか。 宜しくお願いします。

    • 締切済み
    • PHP
  • zipファイルの一部が解凍されないのですが…

    [File01]と[File02]が入っているzipファイル(240MB)を解凍したところ[File02]のファイル(110MB)だけが展開されました。ファイルサイズを見ても[File01]が入っているはずなのですが…。 解凍は[7-Zip]と[Lhaplus]で試してみましたが結果は同じです。 [File01]を解凍展開させる方法をお教え下さい。

  • ZIPファイルを再圧縮するとサイズが大きく変わる

    圧縮前のZIPファイルが600MB程度のサイズだったのですが、 解凍し再度圧縮すると800MB程になってしまいます。 このような事はありえるのでしょうか。 ちなみに圧縮前のZIPファイルは32bitのWindows7で圧縮し 再度圧縮したのは64bitのWindows7ですがこれは関係するのでしょうか。

  • PerlでZipファイルを作りたい

    PerlでZipファイルを作りたいのですが上手くいきません。 実行すると「Internal Server Error」になります。 Perlのバージョン:5.008009 文字コードは、Shift_JIS 改行コードは、Unix(LF)、です。 サーバーは「さくら」です。(ドリームホストも試しましたがダメでした) ファイル構成は zip.cgi data.txt 同じ階層に置いてます。 こちら https://www.h-fj.com/blog/archives/2010/07/19-203224.php のサイトを参考にさせてもらって下のように作ったのですが・・・ (print "Content-type: text/html¥n¥n";)は自分で勝手に 「いるんじゃない?」と思って付け加えました。 私、どこが間違っているのでしょうか? よろしくお願いします。 ———————————————————————————— zip.cgi ———————————————————————————— #!/usr/bin/perl use strict; use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); my $zip = Archive::Zip->new(); # Zipのオブジェクト作成 $zip->addFile('data.txt'); # ファイルを圧縮 # Zipファイルに保存する print "Content-type: text/html¥n¥n"; if ($zip->writeToFileNamed('test.zip') == AZ_OK) { print "test.zip is successfully saved.¥n"; } else { print "test.zip save error.¥n"; } exit;

    • ベストアンサー
    • CGI
  • 助けてください!ZIP 大量のファイルをサイズを指定して圧縮

    いつもありがとうございます。 圧縮関係で困っています。 大量のファイルがあり、それをサイズを統一して圧縮したいのです。 大量の jpg ↓  ○○.zip(例:5MB) ○○.zip(例:5MB) ○○.zip(例:5MB) そのようなことができるソフト どなたか知りませんでしょうか?

  • ファイルのダウンロードが遅い

    windows環境のクライアントPCにブラウザからファイルをダウンロードさせる javaプログラムを作成しています。 linuxのサーバー側でcsvを圧縮したzipファイルを作成しているのですが zipの作成処理までは速いのに、その後のファイル保存のダイアログに とても時間がかかります。なぜなのか分からず困っています。 以下、保存ダイアログ表示のコードです。 --------------------------------------------- FileInputStream fi = new FileInputStream(ファイルパス/temp.zip); byte[] b = new byte[fi.available()]; for (int i = 0; i < b.length; i++) b[i] = (byte)fi.read(); response.setContentType("application/octet-stream; charset=Windows-31J"); response.setHeader("Content-Disposition","attachment; filename=\"temp.zip\""); response.setContentLength(b.length); ServletOutputStream os = response.getOutputStream(); os.write(b); os.close(); fi.close(); --------------------------------------------- ご教授お願いします。

    • ベストアンサー
    • Java
  • PHP Zip 開かない

    よろしくお願いします。現在ZIPにしたものをheaderで出力したいのですが、 その場で解凍した際にフォルダを開くことができません無効ですと表示されます。 原因がわからず困っています。ヒントでも頂ければ助かります。 if(isset($_POST["upload"])){ $dir = file_zone; // Zipファイルの保存先 $file = "./Zipfile/" . date("his") .'.zip'; $root = ""; zipDirectory($dir, $file,$root); } function zipDirectory($dir, $file, $root){ $zip = new ZipArchive(); $res = $zip->open($file, ZipArchive::CREATE); if($res){ // $rootが指定されていればその名前のフォルダにファイルをまとめる if($root != "") { $zip->addEmptyDir($root); $root .= DIRECTORY_SEPARATOR; } $baseLen = mb_strlen($dir); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $localpath = $root . mb_substr($pathname, $baseLen); if( $info->isFile() ){ $zip->addFile($pathname, $localpath); } else { $res = $zip->addEmptyDir($localpath); } } $zip->close(); } else { return false; } header('Content-Type: application/octet-stream'); header(sprintf('Content-Disposition: attachment; filename="%s"',basename($file))); header(sprintf('Content-Length: %d', filesize($file)) ); readfile($file); }

    • ベストアンサー
    • PHP