次のように、AmazonバケットからJPGを強制的にダウンロードしようとしているだけです(またはそうではありません)。
function get_s3_signed_url($bucket, $resource, $AWS_S3_KEY, $AWS_s3_secret_key, $expire_seconds) {
$expires = time()+$expire_seconds;
$string_to_sign = "GET\n\n\n{$expires}\n/".str_replace(".s3-eu-west-1.amazonAWS.com","", $bucket)."/$resource";
$signature = urlencode(base64_encode((hash_hmac("sha1", utf8_encode($string_to_sign), $AWS_s3_secret_key, TRUE))));
$authentication_params = "AWSAccessKeyId=".$AWS_S3_KEY;
$authentication_params.= "&Expires={$expires}";
$authentication_params.= "&Signature={$signature}";
return $link = "https://s3-eu-west-1.amazonAWS.com/{$bucket}/{$resource}?{$authentication_params}";
}
$url = get_s3_signed_url( $aws_bucketName, 'website-hires-photos/photo/'.$filename, $aws_access_key_id, $aws_s3_secret, 30);
header('Content-Type: images/jpg');
header("Content-Transfer-Encoding: Binary");
header('Content-Description: File Transfer');
header("Content-disposition: attachment; filename=\"".$url."\"");
readfile($url);
しかし、次のような専門用語がたくさん出てきます。
zóPcg”<code>îZ~ØsÍêïJ#£Aq$ÓÒ†Nkèk�Á+bÊ˛«∏k.≠ªÄ‡K©˜‰˚FπæÜv§›†˘π#kGGº~{Ölüûˡ�¢¨Ü±S_π̧ àfi˛[Ô fl€≤˛«ˆ/P˙{ß“Ì∫}_˚k'˝cg˙UF–Ò[2kK\OÉá∂¥'_PÓı`oà˘N‰ï˚_ˇ“Ûzöw4∏í x ©ì©”∫—Œ£üä~¸˜ŸÓk£√¯Ö•áıw¨Â“ÀÈ∆äüÓ≠÷9¨º—c∑=üÿYò˜ä^€</p>
非常に興味深い読み物のようですが、座って読む時間がありません。さて、ファイル「種類」がダウンロードされ、サイズが 748kb であると表示され、それがこの写真の正しいサイズです。ただし、ファイルの種類は私のマシンでは不明であるため、テキスト エディターで開くと、上記のゴミが表示されます。
私が間違っていることを教えてください。この時点の前後で、画面に何もエコーしません。上部に 2 つのインクルード リクエストがあります。この関数と、ヘッダーと readfile 関数です。
修正の更新:
これはすべて、事前署名された AWS S3 リンクに、適切な.JPG 拡張子の後にクエリ文字列値があるため.JPG?AWSAccessKeyID=345wrdwf
です。そのため、ダウンロードすると、拡張子が認識されません。次のように、ヘッダー専用の一意の URL を作成することで、これを回避しました。
$headerURL = array_shift(explode('?', basename($url)));
ファイル名の前後のすべてを削除します。だから私はこのようなものになりました:
$url = get_s3_signed_url( $aws_bucketName, 'website-hires-photos/photo/'.$filename, $aws_access_key_id, $aws_s3_secret, 10);
$headerURL = array_shift(explode('?', basename($url)));
header("Content-Transfer-Encoding: binary");
header("Content-Type: image/jpg");
header('Content-Description: File Transfer');
header("Content-Disposition: attachment; filename=".$headerURL);
readfile($url);