9

リンクのzipファイルのURLを作成しhrefてリンクをクリックすると、zipファイルがダウンロードされ、開くと期待どおりのコンテンツが取得されます。

そのHTMLは次のとおりです。

<a href="http://mysite.com/uploads/my-archive.zip">download zip</a>

問題は、ユーザーがこのzipファイルへのアクセスを許可されているかどうかを判断できるように、アプリケーションを指すリンクが必要なことです。

だから私は私のHTMLをこれにしたいです:

 <a href="/canDownload">download zip</a> 

/canDownloadページの私のPHP:

//business logic to determine if user can download

if($yesCanDownload){

$archive='https://mysite.com/uploads/my-archive.zip';
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename($archive));
header("Content-Length: ".filesize($archive));
ob_clean();
flush();
echo readfile("$archive");
}   

だから、問題はコードに関係していると思いますheader()が、私はさまざまなグーグルや他のSOの提案に基づいてそれに関連するたくさんのことを試しましたが、どれもうまくいきません。

私の質問に答えれば、この質問にも答えられる可能性があります。PHPを含むzipファイルは、抽出後にcpgzファイルになります。

4

6 に答える 6

13

私の場合の答えは、readfile()の前に空の行が出力されていたということでした。

だから私は追加しました:

ob_end_clean();

readfile($ filename);

ただし、コード内でこの行が出力されている場所を検索する必要があります。

于 2013-09-11T14:16:52.287 に答える
4

readfileのPHPドキュメントには、ファイルの内容を出力してintを返すと記載されています。

したがって、コードecho readfile("$archive");はエコー$archiveし(ところで、ここでは二重引用符は無意味です。削除する必要があります)、int返されたものを出力します。つまり、行は次のようになります。readfile($archive);

また、アーカイブへのローカルパス(http://リンクではない)を使用する必要があります。

全体として:

if($yesCanDownload){
    $archive='/path/to/my-archive.zip';
    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=".basename($archive));
    header("Content-Length: ".filesize($archive));
    ob_clean();
    flush();
    readfile($archive);
}

最後に、それが機能しない場合filesize($archive)は、ファイルの正確な長さを返していることを確認してください。

于 2012-07-15T20:00:33.237 に答える
2

わかりました、私は自分の質問に答えました。

私が最初に明らかにしなかった主な問題は、ファイルが私のアプリケーションサーバーに配置されていないことでした。これは、AmazonAWSs3バケットに含まれていました。http://mysite...そのため、サーバー上のファイルパスだけでなく、完全なURLを質問に使用しました。fopen()結局のところ、URL(すべてのs3バケット「オブジェクト」、別名ファイル、URLを持っている)を開くことができるので、それが私がしたことです。

これが私の最終的なコードです:

$zip= "http://mysite.com/uploads/my-archive.zip"; // my Amazon AWS s3 url
header("Content-Type: archive/zip"); // works with "application/zip" too
header("Content-Disposition: attachment; filename='my-archive.zip"); // what you want to call the downloaded zip file, can be different from what is in the s3 bucket   
$zip = fopen($zip,"r"); // open the zip file
echo fpassthru($zip); // deliver the zip file
exit(); //non-essential
于 2012-07-15T21:02:27.440 に答える
2

別の考えられる答え、私は見つけました多くの検索の後、私はa*.zipへの「解凍」の2つの考えられる理由が次のとおりであることを発見しました*.zip.cpgz

  1. *.zipファイルが破損しています
  2. 使用されている「解凍」ツールは2GBを超えるファイルを処理できません

Macユーザーであるため、2番目の理由は、ファイルを解凍する際の問題の原因でした。標準のMacOSツールはArchiveUtilityあり、2GBを超えるファイルを処理できないようです。(私にとって問題のファイルは、zip形式の4GBのラズビアンディスクイメージでした。)

私がやったことは、MacのVirtualBoxにすでに存在するDebian仮想マシンを使用することでした。unzipDebian 8.2の6.0は、アーカイブを解凍するのに問題はありませんでした。

于 2015-09-30T23:01:46.400 に答える
1

あなたはいいねにURLを渡していますreadfile()

$archive = 'https://mysite.com/uploads/my-archive.zip';

サーバー上のパスを渡す必要がありますが、次に例を示します。

$archive = '/uploads/my-archive.zip';

ファイルがアップロードフォルダにあると仮定します。

さらに、次のヘッダーを試してください。

header("Content-type: application/octet-stream"); 
header("Content-disposition: attachment; filename=file.zip");  
于 2012-07-15T20:01:10.607 に答える
0

私の場合、public_htmlの上のディレクトリにファイルを作成しようとしましたが、ホスティングのルールで許可されていませんでした。

于 2018-07-21T12:10:24.357 に答える