0

これにはたくさんのスレッドがあることは知っていますが、ここで特有の問題に直面しています

まず、ダウンロード用のzipファイルを出力しようとしています。次のコードがあります

        $file = '/home/www/public/'.$filename;
        header('Content-Type: application/zip');
        header("Content-Transfer-Encoding: Binary");
        header('Content-disposition: attachment; filename='.$filename.'');
        header('Content-Length: '.filesize($file));

        echo readfile($file);

問題は、これらのヘッダーでダウンロードされた zip が破損していることです。開けません (アーカイブの予期しない終了)。Content-length ヘッダーを削除しても破損しませんが、ユーザーはダウンロード時間を確認できません。

exeファイルにも同じコードを適用したかったのですが(タイプをアプリケーション/オクテットストリームに変更するだけです)、同じ結果が得られました。ファイル自体は確かに問題ありません。ダウンロード中に何かが台無しになるだけです

どんな助けでも大歓迎

以下は、私が使用している実際のコードです(2つの変更が既に提案された後)。私はstackoverflowのためにそれを単純化しましたが、おそらくそこに何かがあります

        $id = post('file');
        $object = Software_Files_Model::create()->find($id);

        if ($object->software) {    
           $file = '/home/www/public'.$object->software->getPath();
           $size=$object->software->size;

           header('Content-Type: application/zip');
           header("Content-Transfer-Encoding: Binary");
           header('Content-Disposition: attachment; filename='.$object->software->name.'');
           header('Content-Length: '.$size);

           readfile($file);
           exit;
        }

もう一度追加しますが、ファイルのダウンロードは全体としてです。それが 10 メガバイトの場合、10 メガバイトすべてが正常にダウンロードされ、ファイル名とすべてが保持されます。zip アーカイブを開いてコンテンツを表示することもできます。メッセージが表示されるのは解凍中です

4

1 に答える 1

1

1 行目の $file で定義されている完全なパスではなく、filesize() で $filename のみを使用しています。

于 2013-08-21T21:14:56.687 に答える