Java集成七牛云

Love The Way You Lie 2023-01-01 05:57 248阅读 0赞

本博客代码下载地下:https://github.com/hcitlife/QiNiuDemo

准备工作

注册之后登录,然后按如下步骤操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 接下来到开发者中心--SDK下载--Java SDK,参考里面的文档编写代码就可以了。

服务器端代码示例

第一步:创建SpringBoot项目,添加依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.projectlombok</groupId>
  7. <artifactId>lombok</artifactId>
  8. <optional>true</optional>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. <scope>test</scope>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.qiniu</groupId>
  17. <artifactId>qiniu-java-sdk</artifactId>
  18. <version>7.4.0</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>com.qiniu</groupId>
  22. <artifactId>happy-dns-java</artifactId>
  23. <version>0.1.6</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.squareup.okhttp3</groupId>
  27. <artifactId>okhttp</artifactId>
  28. <version>3.14.8</version>
  29. <scope>compile</scope>
  30. </dependency>
  31. <dependency>
  32. <groupId>com.google.code.gson</groupId>
  33. <artifactId>gson</artifactId>
  34. <version>2.8.6</version>
  35. <scope>compile</scope>
  36. </dependency>

第二步:在resources目录创建七牛属性配置文件qiniu.properties:

  1. qiniu.access-key=AW8tBsAy-uXXdYCO6E0ZDWMYJhY5HOEBboD_MtcH
  2. qiniu.secret-key=kezs7Q_FlHIvwxx6nnslmhoVlh8kqStSarpISjmF
  3. qiniu.bucket=hcstore
  4. # [{ 'region0':'华东'}, { 'region1':'华北'},{ 'region2':'华南'},{ 'regionNa0':'北美'},{ 'regionAs0':''}]
  5. qiniu.region=region2
  6. qiniu.domain-of-bucket=http://qm6ralq5f.hn-bkt.clouddn.com/
  7. # 链接过期时间,单位是秒,3600代表1小时,-1代表永不过期
  8. qiniu.expire-in-seconds=-1

第三步:创建七牛配置文件QiNiuConfig.java:

  1. @Data
  2. public class QiNiuConfig {
  3. private String accessKey;
  4. private String secretKey;
  5. private String bucket;
  6. private Region region;
  7. private String domainOfBucket;
  8. private long expireInSeconds;
  9. private QiNiuConfig(){ //单例设计模式
  10. Properties prop = new Properties();
  11. try {
  12. prop.load(QiNiuConfig.class.getResourceAsStream("/qiniu.properties"));
  13. accessKey = prop.getProperty("qiniu.access-key");
  14. secretKey = prop.getProperty("qiniu.secret-key");
  15. bucket = prop.getProperty("qiniu.bucket");
  16. domainOfBucket = prop.getProperty("qiniu.domain-of-bucket");
  17. expireInSeconds = Long.parseLong(prop.getProperty("qiniu.expire-in-seconds"));
  18. String zoneName = prop.getProperty("qiniu.region");
  19. if(zoneName.equals("region0")){
  20. region = Region.region0();
  21. }else if(zoneName.equals("region1")){
  22. region = Region.region1();
  23. }else if(zoneName.equals("region2")){
  24. region = Region.region2();
  25. }else if(zoneName.equals("regionAs0")){
  26. region = Region.regionAs0();
  27. }else if(zoneName.equals("regionNa0")){
  28. region = Region.regionNa0();
  29. }else{
  30. throw new Exception("Region对象配置错误!");
  31. }
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. private static QiNiuConfig instance = new QiNiuConfig();
  37. public static QiNiuConfig getInstance() {
  38. return instance;
  39. }
  40. }

第三步:编写七牛工具类:

  1. public class QiNiuUtil {
  2. private static final String secretKey = QiNiuConfig.getInstance().getSecretKey();
  3. private static final String bucket = QiNiuConfig.getInstance().getBucket();
  4. private static final Region region = QiNiuConfig.getInstance().getRegion();
  5. private static String accessKey = QiNiuConfig.getInstance().getAccessKey();
  6. /** * 上传本地文件 * * @param localFilePath 本地文件完整路径 * @param key 文件云端存储的名称,值为null时生成随机的文件名,同名文件会发生覆盖 * @return */
  7. public static String upload(String localFilePath, String key) {
  8. UploadManager uploadManager = getUploadManager();
  9. //...生成上传凭证,然后准备上传
  10. Auth auth = Auth.create(accessKey, secretKey);
  11. String upToken;
  12. if (key != null) {
  13. upToken = auth.uploadToken(bucket, key);//覆盖上传凭证
  14. } else {
  15. upToken = auth.uploadToken(bucket);
  16. }
  17. try {
  18. Response response = uploadManager.put(localFilePath, key, upToken);
  19. //解析上传成功的结果
  20. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
  21. return putRet.key;
  22. } catch (QiniuException ex) {
  23. ex.printStackTrace();
  24. return null;
  25. }
  26. }
  27. /** * 上传MultipartFile * * @param file * @param key 文件云端存储的名称,值为null时生成随机的文件名,同名文件会发生覆盖 * @return * @throws IOException */
  28. public static String uploadMultipartFile(MultipartFile file,String key) {
  29. UploadManager uploadManager = getUploadManager();
  30. //把文件转化为字节数组
  31. InputStream is = null;
  32. ByteArrayOutputStream bos = null;
  33. try {
  34. is = file.getInputStream();
  35. bos = new ByteArrayOutputStream();
  36. byte[] b = new byte[1024];
  37. int len = -1;
  38. while ((len = is.read(b)) != -1) {
  39. bos.write(b, 0, len);
  40. }
  41. byte[] uploadBytes = bos.toByteArray();
  42. Auth auth = getAuth();
  43. String upToken;
  44. if (key != null) {
  45. upToken = auth.uploadToken(bucket, key);//覆盖上传凭证
  46. } else {
  47. upToken = auth.uploadToken(bucket);
  48. }
  49. //默认上传接口回复对象
  50. DefaultPutRet putRet;
  51. //进行上传操作,传入文件的字节数组,文件名,上传空间,得到回复对象
  52. Response response = uploadManager.put(uploadBytes, key, upToken);
  53. putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
  54. return putRet.key;
  55. } catch (QiniuException e) {
  56. e.printStackTrace();
  57. return null;
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. return null;
  61. }
  62. }
  63. /** * 获取所有的bucket */
  64. public static String[] getBucketsInfo() {
  65. try {
  66. BucketManager bucketManager = getBucketManager();
  67. //获取所有的bucket信息
  68. String[] buckets = bucketManager.buckets();
  69. return buckets;
  70. } catch (Exception e) {
  71. e.printStackTrace();
  72. }
  73. return null;
  74. }
  75. /** * 获取文件访问地址 * * @param fileName 文件云端存储的名称 * @return * @throws UnsupportedEncodingException */
  76. public static String fileUrl(String fileName) throws UnsupportedEncodingException {
  77. String encodedFileName = URLEncoder.encode(fileName, "utf-8");
  78. String publicUrl = String.format("%s/%s", bucket, encodedFileName);
  79. Auth auth = getAuth();
  80. long expireInSeconds = QiNiuConfig.getInstance().getExpireInSeconds();
  81. if (-1 == expireInSeconds) {
  82. return auth.privateDownloadUrl(publicUrl);
  83. }
  84. return auth.privateDownloadUrl(publicUrl, expireInSeconds);
  85. }
  86. /** * 获取bucket里面所有文件的信息 */
  87. public static FileInfo[] getFileInfo() {
  88. try {
  89. BucketManager bucketManager = getBucketManager();
  90. //文件名前缀
  91. String prefix = "";
  92. //每次迭代的长度限制,最大1000,推荐值 1000
  93. int limit = 1000;
  94. //指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
  95. String delimiter = "";
  96. //列举空间文件列表
  97. BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit, delimiter);
  98. while (fileListIterator.hasNext()) {
  99. //处理获取的file list结果
  100. FileInfo[] items = fileListIterator.next();
  101. return items;
  102. }
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. }
  106. return null;
  107. }
  108. /** * 删除多个文件 * * @param keys 文件名称数组 * @return */
  109. public static Map<String, String> deletes(String... keys) {
  110. Map<String, String> map = new HashMap<>();
  111. try {
  112. //设定删除的数据
  113. BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
  114. batchOperations.addDeleteOp(bucket, keys);
  115. BucketManager bucketManager = getBucketManager();
  116. //发送请求
  117. Response response = bucketManager.batch(batchOperations);
  118. //返回数据
  119. BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
  120. for (int i = 0; i < keys.length; i++) {
  121. BatchStatus status = batchStatusList[i];
  122. String key = keys[i];
  123. if (status.code == 200) {
  124. map.put(key, "delete success");
  125. } else {
  126. map.put(key, "delete failed");
  127. }
  128. }
  129. } catch (Exception e) {
  130. }
  131. return map;
  132. }
  133. /** * 删除bucket中的文件名称 * * @param key 文件名称 * @return */
  134. public static boolean delete(String key) {
  135. try {
  136. BucketManager mg = getBucketManager();
  137. mg.delete(bucket, key);
  138. return true;
  139. } catch (Exception e) {
  140. return false;
  141. }
  142. }
  143. public static Auth getAuth() {
  144. Auth auth = Auth.create(accessKey, secretKey);
  145. return auth;
  146. }
  147. /** * 获取上传管理器 * * @return */
  148. public static UploadManager getUploadManager() {
  149. //构造一个带指定Zone对象的配置类
  150. Configuration cfg = new Configuration(region);
  151. //...其他参数参考类注释
  152. UploadManager uploadManager = new UploadManager(cfg);
  153. return uploadManager;
  154. }
  155. /** * 获取Bucket的管理对象 * * @return */
  156. public static BucketManager getBucketManager() {
  157. Configuration cfg = new Configuration(region);
  158. Auth auth = Auth.create(accessKey, secretKey);
  159. BucketManager bucketManager = new BucketManager(auth, cfg);
  160. return bucketManager;
  161. }
  162. }

工具类测试代码:

  1. @SpringBootTest
  2. class QiNiuUtilTest {
  3. @Test
  4. void upload1() {
  5. String res = QiNiuUtil.upload("E:\\我的文档\\重要文档\\照片\\DSC_0645.jpg", "aaaa");
  6. System.out.println(res);
  7. }
  8. @Test
  9. void upload2() {
  10. String res = QiNiuUtil.upload("E:\\我的文档\\重要文档\\照片\\DSC_0645.jpg", null);
  11. System.out.println(res);
  12. }
  13. @Test
  14. void fileUrl() throws UnsupportedEncodingException {
  15. String url = QiNiuUtil.fileUrl("asdf");
  16. System.out.println(url);
  17. }
  18. @Test
  19. void uploadMultipartFile() {
  20. }
  21. @Test
  22. void getAuth() {
  23. Auth auth = QiNiuUtil.getAuth();
  24. System.out.println(auth);
  25. }
  26. @Test
  27. void getUploadManager() {
  28. BucketManager bucketManager = QiNiuUtil.getBucketManager();
  29. System.out.println(bucketManager);
  30. }
  31. @Test
  32. void getFileInfo() {
  33. FileInfo[] infos = QiNiuUtil.getFileInfo();
  34. for (FileInfo item : infos) {
  35. System.out.println(item.key);
  36. System.out.println(item.hash);
  37. System.out.println(item.fsize);
  38. System.out.println(item.mimeType);
  39. System.out.println(item.putTime);
  40. System.out.println(item.endUser);
  41. System.out.println();
  42. }
  43. }
  44. @Test
  45. void getBucketsInfo() {
  46. String[] buckets = QiNiuUtil.getBucketsInfo();
  47. for (String bucket : buckets) {
  48. System.out.println(bucket);
  49. }
  50. }
  51. @Test
  52. void deletes() {
  53. Map<String, String> map = QiNiuUtil.deletes("bbbb", "asdf");
  54. map.forEach((k, v) -> System.out.println(k + "\t" + v));
  55. }
  56. @Test
  57. void delete() {
  58. boolean res = QiNiuUtil.delete("FvSQe8DCKNTZcoc-pqmmRRVfn3ba");
  59. System.out.println(res);
  60. }
  61. }

第四步:创建Controller:

  1. @RestController
  2. @RequestMapping("/fileController")
  3. public class FileController {
  4. @PostMapping("/upload")
  5. public String upload(@RequestParam("file") MultipartFile multipartFile) {
  6. String res = QiNiuUtil.uploadMultipartFile(multipartFile, null);
  7. return res;
  8. }
  9. }

第五步:启动项目,采用Postman进行测试:

在这里插入图片描述
结果:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读

    相关 面试

    Vue中的懒加载 方式一: Vue工厂函数异步解析组件,Vue 只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供将来重新渲染使用。 V

    相关 工具类

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化PaaS服务 以下工具类采用了两种方式进行文件上传(图片)以及根据文件名称删除文件 impor

    相关 Java--存储图片示例

    项目中会用到大量的图片和小视频,为了分担服务器压力,将文件都放在七牛云。这里的思路很简单,就是移动端、pc端把文件上传到服务器,服务器做一个临时缓存,保存必要的信息到数据库后,

    相关 Java 实现回调

    有这样一个需求:android将文件上传到七牛云,并将文件在七牛云存储的信息返回业务服务器处理。七牛云的sdk上有一个模型解决这种需求,这是原理图: ![这里写图片描述][S