aws 上傳下載文件,下載文件格式錯誤等問題記錄

1.問題
在使用aws提供的aws.phar sdk 上傳和下載文件時,發現jpg,pdf,txt等文件上傳和下載沒有問題,但是壓縮包zip,word文件.doc/.docx 等文件格式的文件,下載有問題,
要麼出現 下載下的文件沒有後綴名,不能打開,
要麼出現word文件下載下來爲zip壓縮包,但是解壓縮也不是正確的word文件
2.代碼及解決方案如下:
代碼:
原始版本:
$key = 12365656565;//獲取當前時間的毫秒級時間戳
$params = [
‘Bucket’ => ‘bucket_name’,
‘Key’ => $key,
‘SourceFile’ => ‘文件絕對路徑’,
];

s3client=newS3Client(self::s3_client = new S3Client(self::S3_CONF);
$result = s3client>putObject(s3_client->putObject(params);

對,對,對,就是這個版本下載有問題

然後查資料發現可能是沒有顯式指明文件格式,修改如下:
版本2:
$key = 12365656565;//獲取當前時間的毫秒級時間戳
$params = [
‘Bucket’ => ‘bucket_name’,
‘Key’ => $key,
‘SourceFile’ => ‘文件絕對路徑’,
‘ContentType’ => $_FILE[‘file’][‘type’], //新增文件格式
];

s3client=newS3Client(self::s3_client = new S3Client(self::S3_CONF);
$result = s3client>putObject(s3_client->putObject(params);

沒錯沒錯,問題仍然存在

版本三:
$key = $_FILE[‘file’][‘name’]; //key爲文件名!!!!!!!
$params = [
‘Bucket’ => ‘bucket_name’,
‘Key’ => $key,
‘SourceFile’ => ‘文件絕對路徑’,
];

s3client=newS3Client(self::s3_client = new S3Client(self::S3_CONF);
$result = s3client>putObject(s3_client->putObject(params);

yes,可以了,終於可以了。
究其原因,是用戶上傳文件到s3時,使用的key就是文件再s3存儲的文件名,由於最開始key是毫秒級時間戳,當時只是考慮key必須唯一,沒想到key和文件名是掛鉤的(講到這裏要說一下,同一個桶下,文件名相同文件就會被覆蓋奧!!覆蓋!!!所以一定要注意key的使用)
如果按照key=毫秒級時間戳(12365656565),s3上的文件名也就是12365656565
key = ‘測試.docx’ ,s3上的文件名也就是 測試.docx

注:這裏要說一下,此時的key,不僅時在s3保存文件的名稱,也是用戶下載文件時的文件名稱,具體規則根據業務選擇就好

3.關於下載
$cmd = $s3_client->getCommand(‘GetObject’, [
‘Bucket’ => $bucket,
‘Key’ => $key
]);

$request = s3client>createPresignedRequest(s3_client->createPresignedRequest(cmd, ‘+20 minutes’);
$presignedUrl = (string) request>getUri();request->getUri(); 沒錯,presignedUrl 這就是下載的鏈接,用他即可

4.以上,純屬根據自己的理解記錄和分享,如果問題歡迎拍磚,大家共同學習,希望能幫得到需要的人

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章