强制使用Amazon S3 JPG下载 - 附件标题URL

时间:2012-07-29 23:15:13

标签: php amazon-s3 http-headers

我只是(或者不是)试图从我的亚马逊桶中强制下载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” îZ~ØsÍêïJ#£Aq$ÓÒ†Nkèk�Á+bÊ˛«∏k.≠ªÄ‡K©˜‰˚FπæÜv§>†˘π#kGGº〜{ÖlüûË¢û±S_π̧àFI [ÔFL€≤˛«/ P {SS“Ì∫} _K '˝cg˙UF-O [2KK \OÉá∂¥' _PÓı`oà˘N‰I_“Ûzöw4Πí   X©ì©”∫-OE£UA〜¸~ŸÓk£√¯Ö•爱华“ÀÈΔäüÓ≠÷9º-CΣ=üÿYò~ä^€

这似乎是一个非常有趣的阅读,但我没有时间坐下来阅读它。现在,文件“种类”下载,它说它的大小为748kb,这是这张照片的正确尺寸。但是,我的机器不知道文件类型,所以我在文本编辑器中打开它,它会产生上述垃圾。

请告诉我我做错了什么。在此之前或之后,我没有回应任何屏幕。我在顶部有两个包含请求,这个函数以及头文件和readfile函数。

FIX UPDATE:

这完全是因为预签名的AWS S3链接在 正确 .JPG扩展名.JPG?AWSAccessKeyID=345wrdwf之后具有查询字符串值。因此,下载时,它将无法识别扩展名。我通过为标题创建一个唯一的URL JUST来解决这个问题,如下所示:

$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);

1 个答案:

答案 0 :(得分:4)

回答了我自己的问题但接受了其他人的知识让我达到了这一点,谢谢你。

这是因为预签名的AWS S3 URL在 正确 .JPG扩展名/photo.jpg?AWSAccessKeyID=345wrdwf之后具有查询字符串值。因此,下载时,它将无法识别文件扩展名。我通过为标题创建一个唯一的URL JUST 来解决这个问题,如下所示:

$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);

并保存为PROPER照片。 Wooooo hooooooo!

这给了我今天有价值的东西。我不知道你可以在标题附件字段中添加任何你喜欢的文件名。无论您添加什么,文件都会保存为用户接受下载时的内容。因此,放置我的公司名称和下载参考是一个huuuge奖金。