0

電子メール メッセージと複数の添付ファイル パスを保存する単純な html フォームがあります。ファイルをサーバーに保存し、ファイルのデータベースへのパスを保存しています。

パスからファイルを取得してユーザーに表示するにはどうすればよいですか。[ダウンロード] をクリックすると、ファイルを取得するために次のコードを使用していますが、これは機能しません。

$query = "
     SELECT `type`, `name`, `size`, `file1`,`file2`,`file3`,`file4`,`file5`
     FROM `upload` WHERE `id` = {$id}";
    $result = $dbLink->query($query);

    if($result) {
         if($result->num_rows == 1) {
             $row = mysqli_fetch_assoc($result);
            header("Content-Type: ". $row['type']);
            header("Content-Length: ". $row['size']);
            header("Content-Disposition: attachment; filename=". $row['name']);

            $path = $row['file1']; 
            $dir = opendir($path);
             echo $dir;
          while ($dir && ($file = readdir($dir)) !== false) {
             echo $file;
                }

エコーされたファイルにはデータが含まれていません。

これは、パスが「file1」にある1つのファイルに対してのみ行っています。同様に、5 つの添付ファイル パスがあり、このコードでそれらをすべて取得する必要があります。どうすればいいですか。

4

1 に答える 1

0

最初: このように複数のダウンロードを行うことはできません。そのヘッダーは一度しか送信できません。それだけです。

$path はファイルへのフルパスですか? テストで最初にチェックするために is_readable($file) を試すことができます。ただし、完全なパスを取得したら、それは簡単です。

header("Content-Type: application/octet-stream");
header("Content-Length: ". $row['size']);
header("Content-Disposition: attachment; filename=". $row['name']);
readfile($row['file1']);
exit();

Readfileは直接出力してストリーミングするため、コンテンツを読み込んでから出力する必要はありません。exit を追加して、その後に他の出力が追加されないようにします。そうしないと、ファイルが破損する可能性があります。

$row['file1'] に正しいパスがあると仮定すると、これは機能します!

複数のファイルの場合、複数の呼び出しを行う必要があります。同様に、ダウンロードのためにクリックできる複数のリンクをユーザーに提供します。

唯一の代替手段は、たとえば zip を使用してまとめて、1 つの大きな zip ファイルとして送信することです。

于 2012-04-16T19:48:53.543 に答える