OSS上傳圖片,檔案或者其他流
阿新 • • 發佈:2019-01-29
1.匯入阿里雲oss的jar包,maven配置如下:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.0.2</version>
</dependency>
2.程式碼部分
public class AliOssClient { private static final Logger LOGGER = LoggerFactory.getLogger(AliOssClient.class); private String accessKeyId; private String accessKeySecret; private String endpoint; public String getAccessKeyId() { return accessKeyId; } public void setAccessKeyId(String accessKeyId) { this.accessKeyId = accessKeyId; } public String getAccessKeySecret() { return accessKeySecret; } public void setAccessKeySecret(String accessKeySecret) { this.accessKeySecret = accessKeySecret; } public String getEndpoint() { return endpoint; } public void setEndpoint(String endpoint) { this.endpoint = endpoint; } /** * 上傳某個Object * @param resourceHost * @param key * @param inputStream * @return */ public PutObjectResult putObject(String resourceHost, String key, InputStream inputStream,String contentType) { OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret); PutObjectResult result = null; try { // 建立上傳Object的Metadata ObjectMetadata meta = new ObjectMetadata(); // 設定檔案型別 meta.setContentType(contentType); // 上傳Object. result = client.putObject(resourceHost, key, inputStream, meta); LOGGER.info("上傳檔案到oss返回result={}",result); } catch (Exception e) { LOGGER.error("exception threw while putObject. resourceHost={}, key={}", resourceHost, key, e); return result; } return result; } /** * 獲取某個Object * @param resourceHost * @param key * @throws IOException */ public InputStream getObject(String resourceHost, String key) throws IOException{ // 初始化OSSClient OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret); InputStream objectContent = null; try { // 獲取Object,返回結果為OSSObject物件 OSSObject object = client.getObject(resourceHost, key); // 獲取Object的輸入流 objectContent = object.getObjectContent(); // 處理Object // 關閉流 // objectContent.close(); return objectContent; } catch (Exception e) { LOGGER.error("exception threw while getObject. resourceHost={}, key={}, exception={}", resourceHost, key, e); return objectContent; } } /** * 分片上傳MultipartUpload * @param resourceHost * @param key * @param inputStream * @return */ public String uploadFile(String resourceHost,String key,MultipartFile partFile)throws IOException { OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret); return multipartUpload(key,partFile,client,resourceHost); } private String multipartUpload(String key, MultipartFile partFile, OSSClient client, String bucketName) throws IOException { // 開始Multipart Upload InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(bucketName, key); InitiateMultipartUploadResult initiateMultipartUploadResult = client.initiateMultipartUpload(initiateMultipartUploadRequest); final int partSize = 1024 * 1024 * 5; // 計算分塊數目 int partCount = (int) (partFile.getSize() / partSize); if (partFile.getSize() % partSize != 0){ partCount++; } // 新建一個List儲存每個分塊上傳後的ETag和PartNumber List<PartETag> partETags = new ArrayList<>(); for(int i = 0; i < partCount; i++){ // 獲取檔案流 InputStream fis = partFile.getInputStream(); // 跳到每個分塊的開頭 long skipBytes =(long) partSize * i; fis.skip(skipBytes); // 計算每個分塊的大小 long size = partSize < partFile.getSize() - skipBytes ? partSize : partFile.getSize() - skipBytes; // 建立UploadPartRequest,上傳分塊 UploadPartRequest uploadPartRequest = new UploadPartRequest(); uploadPartRequest.setBucketName(bucketName); uploadPartRequest.setKey(key); uploadPartRequest.setUploadId(initiateMultipartUploadResult.getUploadId()); uploadPartRequest.setInputStream(fis); uploadPartRequest.setPartSize(size); uploadPartRequest.setPartNumber(i + 1); UploadPartResult uploadPartResult = client.uploadPart(uploadPartRequest); // 將返回的PartETag儲存到List中。 partETags.add(uploadPartResult.getPartETag()); // 關閉檔案 fis.close(); } CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName,key, initiateMultipartUploadResult.getUploadId(), partETags); // 完成分塊上傳 CompleteMultipartUploadResult completeMultipartUploadResult = client.completeMultipartUpload(completeMultipartUploadRequest); // 獲得地址 return completeMultipartUploadResult.getKey(); } }
3.外部如何呼叫
一般 Constants.RESOURCE_PATH=“http://test.baidu.com/”作為字首一般會配在資料庫裡面,而key作為規則路徑,可自己匹配規則,a/uuid/n.pdf之類的;然後根據 url=Constants.RESOURCE_PATH + key 來取資源。
public class Test { public static void main(String[] args) throws IOException { //application/pdf AliOssClient client = new AliOssClient(); client.setAccessKeyId("aliyun oss的鑑權id"); client.setAccessKeySecret("aliyun oss的鑑權祕鑰"); client.setEndpoint("aliyun oss地址"); // 1.上傳pdf到OSS InputStream inputStream = null; //TODO 得到pdf輸入流 PutObjectResult result = client.putObject("http://www.aliyun.com/ad", "/qwew/qwe1/1.pdf", inputStream, "application/pdf"); // 其中 url = http://www.baidu.com/ad + /qwew/qwe1/1.pdf就是下載地址 System.out.println("下載url是"+"http://www.aliyun.com/ad/qwew/qwe1/1.pdf"); // 2.從OSS下載pdf InputStream in = client.getObject("http://www.aliyun.com/ad", "/qwew/qwe1/1.pdf"); //TODO 將流轉化為pdf儲存到檔案或者flush到頁面,在頁面下載 } }