0

ルート ディレクトリから 1 つ上のディレクトリに ZIP ファイルがあります (ホットリンクなどを防ぐため)。コードは次のとおりです。

<?php
    $filename = $_GET['id'];
    if(!$filename){
        header("Location: index.html");
    } else {
      function send_download($filename){
        $file_path = '../../../../downloads/' . $filename . '.zip';
        $file_size=@filesize($file_path);
        header("Content-Type: application/x-zip-compressed");
        header("Content-disposition: attachment; filename=$filename");
        header("Content-Length: $file_size");
        readfile($file_path);
        exit;
    } 
    send_download($filename);
    }
    ?> 

すべての ZIP ファイルに問題はありませんが、「a」タグでこのメソッドを使用すると、ダウンロードのファイル サイズが 0 バイトになります! :(

理由についてのアイデアはありますか?

どうもありがとう!

4

5 に答える 5

0

Content-typeを次のように変更してみてください。

Content-type: application/x-zip;

その前に、ファイルが存在するかどうかを確認してください。

<?php
    $filename = $_GET['id'];
    if(!$filename){
        header("Location: index.html");
    } else{
    function send_download($filename){
    $file_path = '../../../../downloads/' . $filename . '.zip';
    if (file_exists($file_path))
    {
    $file_size=@filesize($file_path);
    header("Content-Type: application/x-zip-compressed");
    header("Content-disposition: attachment; filename=$filename");
    header("Content-Length: $file_size");
    readfile($file_path);
    exit;
    } 
    send_download($filename);
    }
    else
    die("Error 404!");
    }
?>
于 2012-10-08T16:14:11.313 に答える
0
  1. header("場所: http://www.fqdn.tld/file.ext ");

  2. _GET["id"] が > 0 で null ではないことに基づいて、直後に使用された関数を作成したため、不要な目的でコード行を追加しただけです。

  3. 人々が以前にコメントしたように、「@」記号を追加したようですが、これを修正する唯一の方法は次のとおりです。

    • 絶対に使用してはならない @ 記号を削除することは、非常に悪い習慣です。コード内のすべての例外に対応する必要があります。これは、本当に優れたプログラマーになります。(PHP でのスクリプト)

    • error_reporting(E_ALL);

    • ポイント b) を別の行に配置しますが、<?php の後にします。これにより、エラーの完全なリストを確認できます。

  4. コードは問題ありません。問題はパーミッションです。Apache が「ファイル」リポジトリにアクセスできることを確認してください。ファイルがそこにあることを確認できるという事実は、わずかなパーミッションを示唆し、ファイルが存在することを示しています。返されるということは、Apache レベルで読み取り権限が拒否されていることを示唆しています。

于 2012-10-08T16:48:26.803 に答える
0

ファイルサイズのコードは次のとおりです。

<?php 
    $filename = $_GET['id'];
    $file = "../../downloads/" . $filename . ".zip";
    header('Content-type: application/zip'); 
    header("Content-Disposition: attachment; filename=" . $file); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Content-length: " . filesize($file));
    readfile($file); 
    //echo filesize($file);
    exit;  
?>
于 2012-10-09T09:14:36.240 に答える