ufile是Ucloud云的一个对象存储组件,可以将文件上传,下载,分片上传等很多功能,对这个技术不熟悉,第一次使用的时候踩了很多坑,写这篇博客希望能给大家带来一些帮助。
在学习的过程中主要是参考官方给的文档和网上的一篇技术博客, 结合这篇博客和自己遇到的一些坑来给大家讲解一下。
官方给的范例地址:https://github.com/ufilesdk-dev/ufile-javasdk 范例中官方好多名词没有进行解释,只能靠猜,感觉比较坑。
技术博客地址:https://blog.csdn.net/qiunian144084/article/details/79972130
1. 在maven项目中引用jar包,特别需要注意的是,这个jar包中央仓库和阿里私服都没有,需要去下载官方范例,其中有ufile-sdk这个jar包,将jar包上传到自己公司的私服,然后再在项目中引用。
<dependency> <groupId>ufile</groupId> <artifactId>ufile-sdk</artifactId> <version>${ufile_sdk.version}</version> </dependency>
2.ufile.properties配置文件 名称必须是ufile.properties
ufile创建存储空间示例图:
主要配置文件
配置文件参数
bucketName:your bucketName UCloudPublicKey=your_ucloud_public_key UCloudPrivateKey=your_ucloud_private_key ProxySuffix=.ufile.ucloud.cn DownloadProxySuffix=.ufile.ucloud.cn 说明:
bucketName:上传域名的前缀 例如:weiyiyuming UCloudPublicKey 请改成用户的公钥 UCloudPrivateKey 请改成用户的私钥 ProxySuffix 指定上传域名的后缀,可以填写源站的后缀(例如北京地域 .cn-bj.ufileos.com)或内网域名的后缀 DownloadProxySuffix 指定下载域名的后缀,可以填写源站(例如北京地域 .cn-bj.ufileos.com)或加速域名的后缀 (.ufile.ucloud.com.cn)
ufile.bucketName=your bucketName ufile.UCloudPublicKey=your UCloudPublicKey ufile.UCloudPrivateKey=your UCloudPrivateKey ufile.ProxySuffix=.cn-bj.ufileos.com ufile.DownloadProxySuffix=.ufile.ucloud.com.cn
3.资源工具类:ResourceBundle这个类是用于专门读取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); } }
4. 写ufile的工具类 那篇技术博客这里存在一个问题,他ufileUtil中设置参数使用init方法,一直没有设置配置文件中参数,当时我使用的时候一直报 empty key,在源码中找到String authorization = "UCloud " + UFileConfig.getInstance().getUcloudPublicKey() + ":" + signature;我将设置参数的这段代码放在static 静态代码块中解决这个问题。
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); } /** * 上传文件 根据官方文档,本方法中只有relativeUlr是必须的,其他三个参数都是非必须 * @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("读取回执发生异常,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); } } } } } } }
6.ufile创建存储空间域名选择私有空间和公共空间区别
私有空间目前ufile没有提供api获取在线浏览的地址(自己拼凑的地址怎么都不可以访问,因为客户端生成的url带有时间戳),只能在客户端点击获取地址。
公共空间就简单多了,直接可以得到,就是存储域名+存储地址