0

このスクリプトは、私の http ファイル サーバー用です。私は自分のファイルを Web ルートから持っているので、php スクリプトを使用してファイルを取得し、クライアントに送信しています。問題は、ファイルをクリックしてブラウザ (ff および chrome) をダウンロードするときに、ファイルを保存するかどうかを尋ねられないことです。Chrome の Web ツールのネットワークの下で、download.php が正常に実行されたことがわかります。実際、リクエストに対してファイルが転送された場所をバイト単位で確認することさえできます。しかし、ダウンロードしたファイルはクライアント コンピューターにはありません。ブラウザ クライアントがファイルを要求/ダウンロードしないのはなぜですか?

Web サーバーは Nginx です。

<?php

$path = "/trunk/";
$file = $_POST['filename'];
$file_ext = pathinfo($file, PATHINFO_EXTENSION);
$file_name = pathinfo($file, PATHINFO_BASENAME);
$file_full = $path . $file_name;

$finfo = new finfo(FILEINFO_MIME_TYPE);

$ctype = $finfo -> file($file_full);
header("Content-Disposition: attachment; filename=\"".$file_name."\"");
header("Content-Type: " .$ctype);
header("Content-Length: " .filesize($file_full));
error_log(filesize($file_full));

readfile($file_full);

?>

リクエストヘッダー:

POST /php/download.php HTTP/1.1

    Host: www.example.com
    Connection: keep-alive
    Content-Length: 146
    Origin: https://www.example.com
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryMA7u5AkYPL9qGmRY
    Accept: */*
    Referer: https://www.example.com/index.php
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: en-US,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

応答ヘッダー

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 01 Dec 2012 20:22:28 GMT
Content-Type: application/zip
Content-Length: 75090
Connection: keep-alive
Keep-Alive: timeout=300
X-Powered-By: PHP/5.4.6--pl0-gentoo
Content-Disposition: attachment; filename="try.zip"
Expires: Sat, 01 Dec 2012 20:22:27 GMT
Cache-Control: no-cache
4

1 に答える 1

0

Content-Type:application / octet-streamを使用して、すべてのブラウザーで強制ダウンロードを保証します。バイナリコンテンツ(zipなど)を送信していることがわかっている場合は、Content-Transfer-Encoding:binaryも追加します。

于 2012-12-03T09:45:06.697 に答える