2012-07-29 19 views
3

我只是(或沒有),試圖從我的亞馬遜桶強制JPG下載,就像這樣:力Amazon S3的JPG下載 - 附件頭URL

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 〜A ^€

這似乎是一個相當有趣的閱讀,但我沒有時間坐下來閱讀。現在,該文件「種」下載,它說這是748KB的大小,這是此照片的正確尺寸。但是,文件類型是未知的,我的機器,所以我在文本編輯器打開它,它給上面的垃圾。

請告訴我,我做錯了什麼。在這一點之前或之後,我沒有迴應屏幕上的任何內容。在頂部有兩個包含請求,這個函數以及頭文件和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); 
+0

它假設是什麼類型的圖像? – Musa 2012-07-29 23:19:09

+0

@Musa:JPEG,對不起。 – TheCarver 2012-07-29 23:24:10

+0

@PaparazzoKid應該以JFIF開頭,如果JPEG中出現亂碼的文字... – 2012-07-29 23:37:46

回答

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

並保存爲一張正常的照片。 Wooooo hooooooo!

而在今天這個寶貴的教給我的東西。我不知道你可以在標題附件字段中添加任何你喜歡的文件名。無論您添加什麼文件,都會保存該文件在用戶接受下載時保存的內容。所以放置我的公司名稱和下載參考是一個huuuge獎金。