The*_*ver 3 php amazon-s3 http-headers
我只是(或不)试图从我的 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);
Run Code Online (Sandbox Code Playgroud)
但是我得到了很多行话,就像这样:
zóPcg”
îZ~ØsÍêïJ#£Aq$ÓÒ†Nkèk?Á+bÊ?«?k.?ªÄ‡K©˜‰?F?æÜv§›†??#kGGº~{ÖlüûË??¢¨Ü±S_?̧à??[Ô ?€??«ˆ/P?{ß“Ì?}_?k'?cg? UF–Ò[2kK\OÉá?¥'_PÓ?`oà?N‰ï?_?“Ûzöw4?í x©ì©”?—Œ£üä~¸˜ŸÓk£?¯Ö•á?w¨Â“ ÀÈ?äüÓ?÷9¨º—c?=üÿYò˜ä^€
这看起来很有趣,但我没有时间坐下来阅读。现在,文件“有点”下载,它说它的大小为 748kb,这是这张照片的正确大小。但是,我的机器不知道文件类型,所以我在文本编辑器中打开它,它给出了上述垃圾。
请告诉我我做错了什么。在这一点之前或之后,我没有在屏幕上回显任何内容。我在顶部有两个包含请求,这个函数和 headers 和 readfile 函数。
修复更新:
这完全是因为预签名的 AWS S3 链接在正确的.JPG 扩展名之后具有查询字符串值.JPG?AWSAccessKeyID=345wrdwf。因此,下载时,它无法识别扩展名。我通过为标题创建一个唯一的 URL 来解决这个问题,如下所示:
$headerURL = array_shift(explode('?', basename($url)));
Run Code Online (Sandbox Code Playgroud)
这将删除文件名前后的所有内容。所以我最终得到了这样的结果:
$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);
Run Code Online (Sandbox Code Playgroud)
回答了我自己的问题,但利用其他人的知识让我走到了这一步,所以谢谢你。
这完全是因为预签名的 AWS S3 URL 在适当的.JPG 扩展名之后具有查询字符串值/photo.jpg?AWSAccessKeyID=345wrdwf。因此,下载时,它无法识别文件扩展名。我得到了这一轮创建一个唯一的URL JUST的头,像这样:
$headerURL = array_shift(explode('?', basename($url)));
Run Code Online (Sandbox Code Playgroud)
这将删除文件名前后的所有内容。所以我最终得到了这样的结果:
$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);
Run Code Online (Sandbox Code Playgroud)
并保存为正确的照片。呜呜呜呜!
这教会了我今天有价值的东西。我不知道您可以在标题附件字段中添加您喜欢的任何文件名。无论您添加什么,当用户接受下载时,文件都会保存为什么。因此,放置我的公司名称和下载参考是一个巨大的奖励。