UCloud UFile——对象存储UFile SDK基本使用
基本概念
對(duì)象存儲(chǔ) UFile:對(duì)象存儲(chǔ)(UFile)是為互聯(lián)網(wǎng)應(yīng)用提供非結(jié)構(gòu)化文件云存儲(chǔ)的服務(wù);相對(duì)于傳統(tǒng)硬盤存儲(chǔ),UFile云存儲(chǔ)具有存儲(chǔ)無上限、支持高并發(fā)訪問、成本更低等優(yōu)勢(shì);解決業(yè)務(wù)架構(gòu)的文件存儲(chǔ)問題,有效降低海量文件的存儲(chǔ)成本,支持熱點(diǎn)數(shù)據(jù)的高并發(fā)訪問,提升終端用戶訪問體驗(yàn)。實(shí)名認(rèn)證用戶均可享受20GB免費(fèi)云存儲(chǔ)空間和20GB/月免費(fèi)下載流量。
官方網(wǎng)址
https://www.ucloud.cn/site/product/ufile.html?
GitHub
https://github.com/ucloud/ufile-sdk-java
官方文檔
https://docs.ucloud.cn/api/ufile-api/
官方DEMO
https://github.com/ucloud/ufile-sdk-java/tree/master/ufile-sample-java?
Maven
<dependency><groupId>cn.ucloud.ufile</groupId><artifactId>ufile-client-java</artifactId><version>2.4.2</version> </dependency>Gradle?
dependencies {/** your other dependencies*/implementation 'cn.ucloud.ufile:ufile-client-java:2.4.2' }快速入門
基本說明:
所有Ufile所有API均包含同步執(zhí)行(execute)和異步執(zhí)行(executeAsync)兩種執(zhí)行方式。
同步執(zhí)行會(huì)返回指定的業(yè)務(wù)結(jié)果類,若執(zhí)行出錯(cuò)則會(huì)拋出UfileException為父類的異常;
異步執(zhí)行需要傳入U(xiǎn)fileCallback的回調(diào)接口,執(zhí)行成功時(shí)會(huì)回調(diào)onResponse,泛型為回調(diào)結(jié)果(即:同步執(zhí)行的返回類型),值得注意的是,若Ufile Server業(yè)務(wù)錯(cuò)誤,也會(huì)回調(diào)onResponse,請(qǐng)注意結(jié)果類中的信息,若出現(xiàn)異常,則回調(diào)onError。
如果是上傳下載等耗時(shí)API,建議使用異步執(zhí)行(executeAsync),并可以重寫UfileCallback中的onProgress回調(diào)來進(jìn)行進(jìn)度監(jiān)聽
配置UfileClient
必須在使用UfileClient之前調(diào)用,即:必須是UfileClient第一個(gè)調(diào)用的方法才有效。否則使用默認(rèn)UfileClient.Config
UfileClient.configure(new UfileClient.Config(new HttpClient.Config(int maxIdleConnections, long keepAliveDuration, TimeUnit keepAliveTimeUnit).setTimeout(連接超時(shí)ms,讀取超時(shí)ms,寫入超時(shí)ms).setExecutorService(線程池).addInterceptor(okhttp3攔截器).addNetInterceptor(okhttp3網(wǎng)絡(luò)攔截器)));Bucket相關(guān)操作
// Bucket相關(guān)API的授權(quán)器 BucketAuthorization BUCKET_AUTHORIZER = new UfileBucketLocalAuthorization("Your PublicKey", "Your PrivateKey");UfileClient.bucket(BUCKET_AUTHORIZER).APIs // Bucket相關(guān)操作API.execute() or executeAsync(UfileCallback<T>)創(chuàng)建Bucket
同步
try {BucketResponse res = UfileClient.bucket(BUCKET_AUTHORIZER).createBucket(bucketName, region, bucketType).execute(); } catch (UfileClientException e) {e.printStackTrace(); } catch (UfileServerException e) {e.printStackTrace(); }異步
UfileClient.bucket(BUCKET_AUTHORIZER).createBucket(bucketName, region, bucketType).executeAsync(new UfileCallback<BucketResponse>() {@Overridepublic void onResponse(BucketResponse response) {}@Overridepublic void onError(Request request, ApiError error, UfileErrorBean response) {} });對(duì)象相關(guān)操作
關(guān)于ObjectConfig的region參數(shù),是指您的bucket所創(chuàng)建在的地區(qū)編碼,請(qǐng)參考UCloud 地區(qū)列表
// 對(duì)象相關(guān)API的授權(quán)器 ObjectAuthorization OBJECT_AUTHORIZER = new UfileObjectLocalAuthorization("Your PublicKey", "Your PrivateKey");/*** 您也可以創(chuàng)建遠(yuǎn)程對(duì)象相關(guān)API的授權(quán)器,遠(yuǎn)程授權(quán)器將簽名私鑰放于簽名服務(wù)器上,更為安全* 遠(yuǎn)程簽名服務(wù)端示例代碼在 (https://github.com/ucloud/ufile-sdk-auth-server)* 您也可以自行繼承ObjectRemoteAuthorization來重寫遠(yuǎn)程簽名邏輯*/ ObjectAuthorization OBJECT_AUTHORIZER = new UfileObjectRemoteAuthorization(您的公鑰,new ObjectRemoteAuthorization.ApiConfig("http://your_domain/applyAuth","http://your_domain/applyPrivateUrlAuth")); // 對(duì)象操作需要ObjectConfig來配置您的地區(qū)和域名后綴 ObjectConfig config = new ObjectConfig("your bucket region", "ufileos.com");/** * 您也可以使用已登記的自定義域名* 注意'http://www.your_domain.com'指向的是某個(gè)特定的bucket+region+域名后綴,* eg:http://www.your_domain.com -> www.your_bucket.bucket_region.ufileos.com*/ ObjectConfig config = new ObjectConfig("http://www.your_domain.com");/*** ObjectConfig同時(shí)支持從本地文件來導(dǎo)入* 配置文件內(nèi)容必須是含有以下參數(shù)的json字符串:* {"Region":"","ProxySuffix":""} * 或* {"CustomDomain":""}*/try {ObjectConfig.loadProfile(new File("your config profile path"));} catch (UfileFileException e) {e.printStackTrace();}UfileClient.object(OBJECT_AUTHORIZER, config).APIs // 對(duì)象存儲(chǔ)相關(guān)API.execute() or executeAsync(UfileCallback<T>)上傳文件
- 同步
- 異步
封裝工具類?
ufile.bucketName=your bucketName ufile.UCloudPublicKey=your UCloudPublicKey ufile.UCloudPrivateKey=your UCloudPrivateKey ufile.ProxySuffix=.cn-bj.ufileos.com ufile.DownloadProxySuffix=.ufile.ucloud.com.cn?說明:
bucketName:上傳域名的前綴 例如:weiyiyuming
UCloudPublicKey 請(qǐng)改成用戶的公鑰
UCloudPrivateKey 請(qǐng)改成用戶的私鑰
ProxySuffix 指定上傳域名的后綴,可以填寫源站的后綴(例如北京地域 .cn-bj.ufileos.com)或內(nèi)網(wǎng)域名的后綴
DownloadProxySuffix 指定下載域名的后綴,可以填寫源站(例如北京地域 .cn-bj.ufileos.com)或加速域名的后綴 (.ufile.ucloud.com.cn)
資源工具類:ResourceBundle這個(gè)類是用于專門讀取properties文件的??
import java.text.MessageFormat; import java.util.ResourceBundle; /** * 資源文件工具類 */ public class ResourceUtil { private ResourceBundle resourceBundle; private ResourceUtil(String resource) { resourceBundle = ResourceBundle.getBundle(resource); } public static ResourceUtil getResource(String resource) { return new ResourceUtil(resource); } public String getValue(String key) { return resourceBundle.getString(key); } public String getValue(String key, Object... args) { String temp = resourceBundle.getString(key); return MessageFormat.format(temp, args); } }?UFile工具類
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream;import org.apache.http.Header; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import cn.ucloud.ufile.UFileClient; import cn.ucloud.ufile.UFileConfig; import cn.ucloud.ufile.UFileRequest; import cn.ucloud.ufile.UFileResponse; import cn.ucloud.ufile.sender.DeleteSender; import cn.ucloud.ufile.sender.GetSender; import cn.ucloud.ufile.sender.PutSender; /** * ufile操作工具 * Created by win 10 on 2018/4/11. */ public class UfileUtil { private static final Logger logger = LoggerFactory.getLogger(UfileUtil.class); private static final ResourceUtil resourceUtil=ResourceUtil.getResource("ufile"); // 文件分類地址,可以自定義 private static final String bucketName = resourceUtil.getValue("ufile.bucketName"); private static final String UCloudPublicKey=resourceUtil.getValue("ufile.UCloudPublicKey"); private static final String UCloudPrivateKey=resourceUtil.getValue("ufile.UCloudPrivateKey"); private static final String ProxySuffix=resourceUtil.getValue("ufile.ProxySuffix"); private static final String DownloadProxySuffix=resourceUtil.getValue("ufile.DownloadProxySuffix"); //圖片大小public static Integer ImageSize=Integer.valueOf(resourceUtil.getValue("ufile.imageSize"));//圖片路徑前綴public static final String PathProxySuffix=resourceUtil.getValue("ufile.pathProxySuffix");static {UFileConfig.getInstance().setUcloudPublicKey(UCloudPublicKey); UFileConfig.getInstance().setUcloudPrivateKey(UCloudPrivateKey); UFileConfig.getInstance().setProxySuffix(ProxySuffix); UFileConfig.getInstance().setDownloadProxySuffix(DownloadProxySuffix); }/** * 上傳文件 根據(jù)官方文檔,本方法中只有relativeUlr是必須的,其他三個(gè)參數(shù)都是非必須* @param relativeUrl 文件上傳至ufile的地址 如:/images/xxx.png * @param contentType 自定義文件類型 ????????* @param inputStream * @param contentLength * @throws IOException */ public static void uploadFile(String relativeUrl, String contentType, InputStream inputStream, long contentLength) throws IOException { UFileRequest request = new UFileRequest(); request.setBucketName(bucketName); System.out.println("文件url:"+relativeUrl);request.setKey(relativeUrl); request.setContentType(contentType); request.setInputStream(inputStream); request.setContentLength(contentLength); UFileClient ufileClient = new UFileClient(); System.out.println("===================================");String ucloudPrivateKey2 = UFileConfig.getInstance().getUcloudPrivateKey();System.out.println("ProxySuffix:"+ UFileConfig.getInstance().getProxySuffix());System.out.println("DownloadProxySuffix:"+ UFileConfig.getInstance().getDownloadProxySuffix());System.out.println("私匙:"+ucloudPrivateKey2);System.out.println("公匙:"+UFileConfig.getInstance().getUcloudPublicKey());System.out.println("===================================");putFile(ufileClient, request); ufileClient.shutdown(); inputStream.close(); } /*** 下載文件* @param relativeUrl* @param contentType* @param outputStream*/public void downloadFile(String relativeUrl, String contentType, OutputStream outputStream) { UFileRequest request = new UFileRequest(); request.setBucketName(bucketName); request.setKey(relativeUrl); UFileClient ufileClient = null; try { ufileClient = new UFileClient(); getFile(ufileClient, request, outputStream); } catch (Exception e) { logger.error("讀取回執(zhí)發(fā)生異常,relativeUrl={},{}", relativeUrl, e); } finally { ufileClient.shutdown(); try { outputStream.close(); } catch (IOException e) { logger.error("", e); } } } public static void deleteFile(String relativeUrl) { UFileRequest request = new UFileRequest(); request.setBucketName(bucketName); request.setKey(relativeUrl); UFileClient ufileClient = null; try { ufileClient = new UFileClient(); deleteFile(ufileClient, request); } finally { ufileClient.shutdown(); } } private static void putFile(UFileClient ufileClient, UFileRequest request) throws IOException { PutSender sender = new PutSender(); sender.makeAuth(ufileClient, request); UFileResponse response = sender.send(ufileClient, request); if (response != null) {InputStream inputStream = response.getContent(); if (inputStream != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String s = ""; while ((s = reader.readLine()) != null) { logger.info(s); } inputStream.close(); } } } private static void getFile(UFileClient ufileClient, UFileRequest request, OutputStream outputStream) { GetSender sender = new GetSender(); sender.makeAuth(ufileClient, request); UFileResponse response = sender.send(ufileClient, request); if (response != null) { if (response.getStatusLine().getStatusCode() != 200 && response.getContent() != null) { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(response.getContent())); String input; while ((input = br.readLine()) != null) { logger.info(input); } } catch (IOException e) { logger.error("", e); } finally { if (response.getContent() != null) { try { response.getContent().close(); } catch (IOException e) { logger.error("", e); } } } } else { InputStream inputStream = null; try { inputStream = response.getContent(); int bufSize = 1024 * 4; byte[] buffer = new byte[bufSize]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, bytesRead); } } catch (IOException e) { logger.error("", e); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { logger.error("", e); } } if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { logger.error("", e); } } } } } } private static void deleteFile(UFileClient ufileClient, UFileRequest request) { DeleteSender sender = new DeleteSender(); sender.makeAuth(ufileClient, request); UFileResponse response = sender.send(ufileClient, request); if (response != null) { System.out.println("status line: " + response.getStatusLine()); Header[] headers = response.getHeaders(); for (int i = 0; i < headers.length; i++) { System.out.println("header " + headers[i].getName() + " : " + headers[i].getValue()); } System.out.println("body length: " + response.getContentLength()); if (response.getContent() != null) { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(response.getContent())); String input; while ((input = br.readLine()) != null) { System.out.println(input); } } catch (IOException e) { logger.error("", e); } finally { if (br != null) { try { br.close(); } catch (IOException e) { logger.error("", e); } } } } } } }Spring Boot整合?
application.properties?
ucloud.ufile.public-key=TOKEN_f465454a-f3ab-4c9b-91a5-c7babf59cc38 ucloud.ufile.private-key=18977163-f21e-4deb-a2e3-9bfa0b888ba5 ucloud.ufile.bucket-name=mawen ucloud.ufile.region=cn-bj ucloud.ufile.suffix=ufileos.com ucloud.ufile.expires=315360000源代碼?
import cn.ucloud.ufile.UfileClient; import cn.ucloud.ufile.api.object.ObjectConfig; import cn.ucloud.ufile.auth.ObjectAuthorization; import cn.ucloud.ufile.auth.UfileObjectLocalAuthorization; import cn.ucloud.ufile.bean.PutObjectResultBean; import cn.ucloud.ufile.exception.UfileClientException; import cn.ucloud.ufile.exception.UfileServerException; import life.majiang.community.exception.CustomizeErrorCode; import life.majiang.community.exception.CustomizeException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service;import java.io.InputStream; import java.util.UUID;/*** Created by codedrinker on 2019/6/28.*/ @Service @Slf4j public class UCloudProvider {@Value("${ucloud.ufile.public-key}")private String publicKey;@Value("${ucloud.ufile.private-key}")private String privateKey;@Value("${ucloud.ufile.bucket-name}")private String bucketName;@Value("${ucloud.ufile.region}")private String region;@Value("${ucloud.ufile.suffix}")private String suffix;@Value("${ucloud.ufile.expires}")private Integer expires;public String upload(InputStream fileStream, String mimeType, String fileName) {String generatedFileName;String[] filePaths = fileName.split("\\.");if (filePaths.length > 1) {generatedFileName = UUID.randomUUID().toString() + "." + filePaths[filePaths.length - 1];} else {throw new CustomizeException(CustomizeErrorCode.FILE_UPLOAD_FAIL);}try {ObjectAuthorization objectAuthorization = new UfileObjectLocalAuthorization(publicKey, privateKey);ObjectConfig config = new ObjectConfig(region, suffix);PutObjectResultBean response = UfileClient.object(objectAuthorization, config).putObject(fileStream, mimeType).nameAs(generatedFileName).toBucket(bucketName).setOnProgressListener((bytesWritten, contentLength) -> {}).execute();if (response != null && response.getRetCode() == 0) {String url = UfileClient.object(objectAuthorization, config).getDownloadUrlFromPrivateBucket(generatedFileName, bucketName, expires).createUrl();return url;} else {log.error("upload error,{}", response);throw new CustomizeException(CustomizeErrorCode.FILE_UPLOAD_FAIL);}} catch (UfileClientException e) {log.error("upload error,{}", fileName, e);throw new CustomizeException(CustomizeErrorCode.FILE_UPLOAD_FAIL);} catch (UfileServerException e) {log.error("upload error,{}", fileName, e);throw new CustomizeException(CustomizeErrorCode.FILE_UPLOAD_FAIL);}} } package com.zstu.metrocity.provider;import cn.ucloud.ufile.UfileClient; import cn.ucloud.ufile.api.ApiError; import cn.ucloud.ufile.api.object.ObjectConfig; import cn.ucloud.ufile.api.object.policy.PolicyParam; import cn.ucloud.ufile.api.object.policy.PutPolicy; import cn.ucloud.ufile.api.object.policy.PutPolicyForCallback; import cn.ucloud.ufile.auth.*; import cn.ucloud.ufile.bean.PutObjectResultBean; import cn.ucloud.ufile.bean.UfileErrorBean; import cn.ucloud.ufile.exception.UfileClientException; import cn.ucloud.ufile.exception.UfileServerException; import cn.ucloud.ufile.http.HttpClient; import cn.ucloud.ufile.http.OnProgressListener; import cn.ucloud.ufile.http.UfileCallback; import cn.ucloud.ufile.util.StorageType; import lombok.extern.slf4j.Slf4j; import okhttp3.Request; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service;import java.io.File; import java.io.InputStream; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit;/*** @Author ShenTuZhiGang* @Version 1.0.0* @Date 2020-04-16 20:55*/ @Service @Slf4j public class UCloudProvider {@Value("${ucloud.ufile.public-key}")private String publicKey;@Value("${ucloud.ufile.private-key}")private String privateKey;@Value("${ucloud.ufile.bucket-name}")private String bucketName;@Value("${ucloud.ufile.region}")private String region;@Value("${ucloud.ufile.proxy-suffix}")private String proxySuffix;@Value("${ucloud.ufile.expires}")private Integer expires;@Value("${ucloud.ufile.log.tag}")private String tag;static {/*** 配置UfileClient,必須在使用UfileClient之前調(diào)用*/UfileClient.configure(new UfileClient.Config(new HttpClient.Config(10, 5, TimeUnit.MINUTES).setTimeout(10 * 1000, 30 * 1000, 30 * 1000).setExecutorService(Executors.newSingleThreadExecutor())));}@Autowiredprivate BucketAuthorization bucketAuthorization;@Autowiredprivate UfileObjectLocalAuthorization objectAuthorization;@Autowiredprivate UfileObjectRemoteAuthorization objectRemoteAuthorization;@Autowiredprivate ObjectConfig config;public String putFile(File file, String mimeType, String nameAs){return putFile(file, mimeType, nameAs ,bucketName);}public String putFile(File file, String mimeType, String nameAs, String toBucket) {try {/*** 上傳回調(diào)策略* 必須填寫回調(diào)接口url(目前僅支持http,不支持https),可選填回調(diào)參數(shù),回調(diào)參數(shù)請(qǐng)自行決定是否需要urlencode* 若配置上傳回調(diào),則上傳接口的回調(diào)將會(huì)透傳回調(diào)接口的response,包括httpCode*/PutPolicy putPolicy = new PutPolicyForCallback.Builder("http://xxx.xxx.xxx.xxx[:port][/path]").addCallbackBody(new PolicyParam("key", "value")).build();PutObjectResultBean response = UfileClient.object(objectAuthorization, config).putObject(file, mimeType).nameAs(nameAs).toBucket(toBucket)/*** 配置文件存儲(chǔ)類型,分別是標(biāo)準(zhǔn)、低頻、冷存,對(duì)應(yīng)有效值:STANDARD | IA | ARCHIVE*/.withStorageType(StorageType.STANDARD)/*** 為云端對(duì)象配置自定義數(shù)據(jù),每次調(diào)用將會(huì)替換之前數(shù)據(jù)。* 所有的自定義數(shù)據(jù)總大小不能超過 8KB。*/ // .withMetaDatas()/*** 為云端對(duì)象添加自定義數(shù)據(jù),可直接調(diào)用,無須先調(diào)用withMetaDatas* key不能為空或者""**/ // .addMetaData(new Parameter<>("key","value"))/*** 配置上傳回調(diào)策略*/ // .withPutPolicy(putPolicy)/*** 是否上傳校驗(yàn)MD5*/ // .withVerifyMd5(false)/*** 指定progress callback的間隔*/ // .withProgressConfig(ProgressConfig.callbackWithPercent(10))/*** 配置讀寫流Buffer的大小, Default = 256 KB, MIN = 4 KB, MAX = 4 MB*/ // .setBufferSize(4 << 20)/*** 配置進(jìn)度監(jiān)聽*/.setOnProgressListener(new OnProgressListener() {@Overridepublic void onProgress(long bytesWritten, long contentLength) {log.debug(tag, String.format("[progress] = %d%% - [%d/%d]", (int) (bytesWritten * 1.f / contentLength * 100), bytesWritten, contentLength));}}).execute();log.debug(tag, String.format("[res] = %s", (response == null ? "null" : response.toString())));if (response != null && response.getRetCode() == 0) {String url = UfileClient.object(objectAuthorization, config).getDownloadUrlFromPrivateBucket(nameAs, toBucket, expires).createUrl();return url;} else {log.error("upload error,{}", response);throw new RuntimeException("File Upload Error");}} catch (UfileClientException e) {log.error("upload error,{}", nameAs, e);e.printStackTrace();throw new RuntimeException("File Upload Error");} catch (UfileServerException e) {log.error("upload error,{}", nameAs, e);e.printStackTrace();throw new RuntimeException("File Upload Error");}}public void putFileAsync(File file, String mimeType, String nameAs, String toBucket) throws UfileClientException {/*** 上傳回調(diào)策略* 必須填寫回調(diào)接口url(目前僅支持http,不支持https),可選填回調(diào)參數(shù),回調(diào)參數(shù)請(qǐng)自行決定是否需要urlencode* 若配置上傳回調(diào),則上傳接口的回調(diào)將會(huì)透傳回調(diào)接口的response,包括httpCode*/PutPolicy putPolicy = new PutPolicyForCallback.Builder("http://xxx.xxx.xxx.xxx[:port][/path]").addCallbackBody(new PolicyParam("key", "value")).build();UfileClient.object(objectAuthorization, config).putObject(file, mimeType).nameAs(nameAs).toBucket(toBucket)/*** 配置文件存儲(chǔ)類型,分別是標(biāo)準(zhǔn)、低頻、冷存,對(duì)應(yīng)有效值:STANDARD | IA | ARCHIVE*/.withStorageType(StorageType.STANDARD)/*** 為云端對(duì)象配置自定義數(shù)據(jù),每次調(diào)用將會(huì)替換之前數(shù)據(jù)。* 所有的自定義數(shù)據(jù)總大小不能超過 8KB。*/ // .withMetaDatas()/*** 為云端對(duì)象添加自定義數(shù)據(jù),可直接調(diào)用,無須先調(diào)用withMetaDatas* key不能為空或者""**/ // .addMetaData(new Parameter<>("key","value"))/*** 配置上傳回調(diào)策略*/ // .withPutPolicy(putPolicy)/*** 是否上傳校驗(yàn)MD5*/ // .withVerifyMd5(false)/*** 指定progress callback的間隔*/ // .withProgressConfig(ProgressConfig.callbackWithPercent(10))/*** 配置讀寫流Buffer的大小, Default = 256 KB, MIN = 4 KB, MAX = 4 MB*/ // .setBufferSize(4 << 20).executeAsync(new UfileCallback<PutObjectResultBean>() {@Overridepublic void onProgress(long bytesWritten, long contentLength) {log.debug(tag, String.format("[progress] = %d%% - [%d/%d]", (int) (bytesWritten * 1.f / contentLength * 100), bytesWritten, contentLength));}@Overridepublic void onResponse(PutObjectResultBean response) {log.debug(tag, String.format("[res] = %s", (response == null ? "null" : response.toString())));}@Overridepublic void onError(Request request, ApiError error, UfileErrorBean response) {log.debug(tag, String.format("[error] = %s\n[info] = %s",(error == null ? "null" : error.toString()),(response == null ? "null" : response.toString())));}});}public String putStream(InputStream stream, String mimeType, String nameAs){return putStream(stream, mimeType, nameAs ,bucketName);}public String putStream(InputStream stream, String mimeType, String nameAs, String toBucket) {try {/*** 上傳回調(diào)策略* 必須填寫回調(diào)接口url(目前僅支持http,不支持https),可選填回調(diào)參數(shù),回調(diào)參數(shù)請(qǐng)自行決定是否需要urlencode* 若配置上傳回調(diào),則上傳接口的回調(diào)將會(huì)透傳回調(diào)接口的response,包括httpCode*/PutPolicy putPolicy = new PutPolicyForCallback.Builder("http://xxx.xxx.xxx.xxx[:port][/path]").addCallbackBody(new PolicyParam("key", "value")).build();PutObjectResultBean response = UfileClient.object(objectAuthorization, config).putObject(stream, mimeType).nameAs(nameAs).toBucket(toBucket)/*** 配置文件存儲(chǔ)類型,分別是標(biāo)準(zhǔn)、低頻、冷存,對(duì)應(yīng)有效值:STANDARD | IA | ARCHIVE*/.withStorageType(StorageType.STANDARD)/*** 為云端對(duì)象配置自定義數(shù)據(jù),每次調(diào)用將會(huì)替換之前數(shù)據(jù)。* 所有的自定義數(shù)據(jù)總大小不能超過 8KB。*/ // .withMetaDatas()/*** 為云端對(duì)象添加自定義數(shù)據(jù),可直接調(diào)用,無須先調(diào)用withMetaDatas* key不能為空或者""**/ // .addMetaData(new Parameter<>("key","value"))/*** 配置上傳回調(diào)策略*/ // .withPutPolicy(putPolicy)/*** 是否上傳校驗(yàn)MD5*/ // .withVerifyMd5(false)/*** 指定progress callback的間隔*/ // .withProgressConfig(ProgressConfig.callbackWithPercent(10))/*** 配置讀寫流Buffer的大小, Default = 256 KB, MIN = 4 KB, MAX = 4 MB*/ // .setBufferSize(4 << 20)/*** 配置進(jìn)度監(jiān)聽*/.setOnProgressListener(new OnProgressListener() {@Overridepublic void onProgress(long bytesWritten, long contentLength) {log.debug(tag, String.format("[progress] = %d%% - [%d/%d]", (int) (bytesWritten * 1.f / contentLength * 100), bytesWritten, contentLength));}}).execute();log.debug(tag, String.format("[res] = %s", (response == null ? "null" : response.toString())));if (response != null && response.getRetCode() == 0) {String url = UfileClient.object(objectAuthorization, config).getDownloadUrlFromPrivateBucket(nameAs, toBucket, expires).createUrl();return url;} else {log.error("upload error,{}", response);throw new RuntimeException("File Upload Error");}} catch (UfileClientException e) {log.error("upload error,{}", nameAs, e);e.printStackTrace();throw new RuntimeException("File Upload Error");} catch (UfileServerException e) {log.error("upload error,{}", nameAs, e);e.printStackTrace();throw new RuntimeException("File Upload Error");}}public void putStreamAsync(InputStream stream, String mimeType, String nameAs, String toBucket) throws UfileClientException {/*** 上傳回調(diào)策略* 必須填寫回調(diào)接口url(目前僅支持http,不支持https),可選填回調(diào)參數(shù),回調(diào)參數(shù)請(qǐng)自行決定是否需要urlencode* 若配置上傳回調(diào),則上傳接口的回調(diào)將會(huì)透傳回調(diào)接口的response,包括httpCode*/PutPolicy putPolicy = new PutPolicyForCallback.Builder("http://xxx.xxx.xxx.xxx[:port][/path]").addCallbackBody(new PolicyParam("key", "value")).build();UfileClient.object(objectAuthorization, config).putObject(stream, mimeType).nameAs(nameAs).toBucket(toBucket)/*** 配置文件存儲(chǔ)類型,分別是標(biāo)準(zhǔn)、低頻、冷存,對(duì)應(yīng)有效值:STANDARD | IA | ARCHIVE*/.withStorageType(StorageType.STANDARD)/*** 為云端對(duì)象配置自定義數(shù)據(jù),每次調(diào)用將會(huì)替換之前數(shù)據(jù)。* 所有的自定義數(shù)據(jù)總大小不能超過 8KB。*/ // .withMetaDatas()/*** 為云端對(duì)象添加自定義數(shù)據(jù),可直接調(diào)用,無須先調(diào)用withMetaDatas* key不能為空或者""**/ // .addMetaData(new Parameter<>("key","value"))/*** 配置上傳回調(diào)策略*/ // .withPutPolicy(putPolicy)/*** 是否上傳校驗(yàn)MD5*/ // .withVerifyMd5(false)/*** 指定progress callback的間隔*/ // .withProgressConfig(ProgressConfig.callbackWithPercent(10))/*** 配置讀寫流Buffer的大小, Default = 256 KB, MIN = 4 KB, MAX = 4 MB*/ // .setBufferSize(4 << 20).executeAsync(new UfileCallback<PutObjectResultBean>() {@Overridepublic void onProgress(long bytesWritten, long contentLength) {log.debug(tag, String.format("[progress] = %d%% - [%d/%d]", (int) (bytesWritten * 1.f / contentLength * 100), bytesWritten, contentLength));}@Overridepublic void onResponse(PutObjectResultBean response) {log.debug(tag, String.format("[res] = %s", (response == null ? "null" : response.toString())));}@Overridepublic void onError(Request request, ApiError error, UfileErrorBean response) {log.debug(tag, String.format("[error] = %s\n[info] = %s",(error == null ? "null" : error.toString()),(response == null ? "null" : response.toString())));}});} }?
常見問題
1、UFile創(chuàng)建存儲(chǔ)空間域名選擇私有空間和公共空間區(qū)別
私有空間目前UFile沒有提供api獲取在線瀏覽的地址(自己拼湊的地址怎么都不可以訪問,因?yàn)榭蛻舳松傻膗rl帶有時(shí)間戳),只能在客戶端點(diǎn)擊獲取地址。
公共空間就簡單多了,直接可以得到,就是存儲(chǔ)域名+存儲(chǔ)地址
?
教學(xué)資源
https://www.bilibili.com/video/BV1r4411r7au?p=54
參考文章
https://blog.csdn.net/touzizhuo03/article/details/80094705
https://blog.csdn.net/han_xiaoxue/article/details/77154451
https://blog.csdn.net/qiunian144084/article/details/79972130
https://www.jianshu.com/p/dd8b52156c9f
總結(jié)
以上是生活随笔為你收集整理的UCloud UFile——对象存储UFile SDK基本使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebSocket——stomp连接错误
- 下一篇: 阿里云ECS——[您的云服务器(xxx.