使用預簽名URL直傳媒體存儲
更新時間 2024-10-16 15:15:37
最近更新時間: 2024-10-16 15:15:37
分享文章
本文介紹使用預簽名URL直傳媒體存儲的最佳實踐。
實踐背景
對象存儲SDK提供預簽名接口可以生成預簽名URL,通過預簽名URL,移動端APP可以直接上傳或者下載文件。不需要使用SDK和密鑰,使用HTTP接口就可以進行文件的上傳和下載。
應用流程
使用預簽名URL直傳媒體存儲應用流程如下:

實踐步驟
生成預簽名URL
業務服務器配置長期密鑰,調用預簽名接口生成預簽名URL,具體可參照如下java示例。如需其他語言SDK 示例,可參考:SDK概覽 。
- 上傳預簽名
String?bucketName?=?"<your-bucket-name>";
String?objectKey?=?"<your-object-key>";
LocalDateTime?expirationDateTime?=?LocalDateTime.now().plusSeconds(5?*?60);?//url的有效時間5分鐘
Date?expiration?=?Date.from(expirationDateTime.atZone(ZoneId.systemDefault()).toInstant());
try?{
????GeneratePresignedUrlRequest?generatePresignedUrlRequest?=?new?GeneratePresignedUrlRequest(bucketName,?objectKey)
????????????.withMethod(HttpMethod.PUT)
????????????.withExpiration(expiration);
????URL?url?=?s3.generatePresignedUrl(generatePresignedUrlRequest);
}?catch?(AmazonServiceException?e)?{
????System.err.println(e.getErrorMessage());
}
- 下載預簽名
String?bucketName?=?"<your-bucket-name>";
String?objectKey?=?"<your-object-key>";
try?{
????GeneratePresignedUrlRequest?generatePresignedUrlRequest?=?new?GeneratePresignedUrlRequest(bucketName,?objectKey)
????????????.withMethod(HttpMethod.GET)
????????????.withExpiration(expiration);
????URL?url?=?s3.generatePresignedUrl(generatePresignedUrlRequest);
}?catch?(AmazonServiceException?e)?{
????System.err.println(e.getErrorMessage());
}
使用預簽名URL直傳
移動端通過業務服務器獲取到預簽名URL,使用HTTP接口和預簽名URL上傳或者下載文件。具體可參照如下示例。
- 上傳
Log.i(TAG,?"upload");
try?{
OkHttpClient?httpClient?=?new?OkHttpClient.Builder()
.followRedirects(false)
.retryOnConnectionFailure(false)
.cache(null)
.build();
MediaType?mediaType?=?MediaType.parse("text/plain");
RequestBody?body?=?RequestBody.create("file?content",?mediaType);
Request?httpRequest?=?new?Request.Builder()
.url(url)
.put(body)
.build();
Call?c?=?httpClient.newCall(httpRequest);
Response?res?=?c.execute();
Log.i(TAG,?"Status:"?+?res.code());
if?(res.header("ETag")?!=?null)?{
Log.i(TAG,?"ETag:"?+?res.header("ETag"));
}
res.close();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
- 下載
private?void?download(String?url)?{
Log.i(TAG,?"download");
try?{
OkHttpClient?httpClient?=?new?OkHttpClient.Builder()
.followRedirects(false)
.retryOnConnectionFailure(false)
.cache(null)
.build();
Request?httpRequest?=?new?Request.Builder()
.url(url)
.get()
.build();
Call?c?=?httpClient.newCall(httpRequest);
Response?res?=?c.execute();
Log.i(TAG,?"Status:"?+?res.code());
if?(res.body()?!=?null)?{
Log.i(TAG,?"Content:"?+?res.body().string());
}
res.close();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}