1

Amazon AWS によって提供されている画像へのリンクをユーザーがクリックしたときに、ブラウザにダウンロード ダイアログを強制的に表示させようとしています。これを行うための次のPHPスクリプトがありますが、これはほとんど機能しています。ただし、代わりに文字化けしたテキストの Web ページを生成する iPad では失敗します。ヘッダーの Content-Type を「image/jpeg」に設定しているにもかかわらず、結果のファイルが CSV として表示され、iPad で問題を引き起こしている可能性があります (一方、デスクトップ ブラウザーは正しいタイプに修正されています)。

Content-Type のdie()前にaを配置すると、JPEG として表示されます。fpassthru($fp)

Content-Type が正しく設定され、JPEG として配信されるようにするにはどうすればよいですか?

$urlComponents = parse_url($url); // where URL is the URL to the image on AWS
if (!isset($urlComponents['path'])) {
    die();
}
$pathParts = pathinfo($urlComponents['path']);
if (!isset($pathParts['basename'])) {
    die();
} else {
    $image = $pathParts['basename'];
}

$fp = fopen($url, 'rb');

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$image");
header("Content-Type: image/jpeg");
header("Content-Transfer-Encoding: binary");

fpassthru($fp);

fclose($fp);

このコードは、PHP.net の Web サイトhttp://php.net/manual/en/function.fpassthru.phpにある例に基づいています。

4

2 に答える 2

2

fpassthru はヘッダーを設定しないため、問題はその前または後にあります (ポストコントローラー コード)

于 2012-12-20T15:03:31.677 に答える
0

ヘッダー名とその値の前のセミコロンの間にスペースを入れることは、ヘッダーを持たないのと同じくらい良いことに言及する必要があります。デフォルトでは text/html になります。

header('Content-type : image/jpeg'); //will not work. will default to text/html
header('Content-type: image/jpeg'); //will work

また、Content-Type ではなく Content-type です。フィールド名は大文字と小文字を区別します

4.2 メッセージヘッダー

general-header (セクション 4.5)、request-header (セクション 5.3)、response-header (セクション 6.2)、および entity-header (セクション 7.1) フィールドを含む HTTP ヘッダー フィールドは、セクションで指定されているものと同じ一般的な形式に従います。 RFC 822 [9] の 3.1。各ヘッダー フィールドは、名前の後にコロン (":") とフィールド値が続く形式で構成されます。フィールド名は大文字と小文字を区別しません。

ハイパーテキスト転送プロトコル -- HTTP/1.1 :

明らかに、ヘッダーが設定される前に他の出力がないことを確認する必要があります。出力バッファリングは、ブラウザに何も出力しないようにするための良い方法です。

于 2013-03-03T11:51:07.957 に答える