You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 5.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. # spring-boot-demo-upload
  2. > 本 demo 演示了 Spring Boot 如何实现本地文件上传以及如何上传文件至七牛云平台。前端使用 vue 和 iview 实现上传页面。
  3. ## 1.开发步骤
  4. ### 1.1.添加依赖
  5. ```xml
  6. <dependencies>
  7. <dependency>
  8. <groupId>com.xkcoding</groupId>
  9. <artifactId>common-tools</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-web</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-test</artifactId>
  22. <scope>test</scope>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.qiniu</groupId>
  26. <artifactId>qiniu-java-sdk</artifactId>
  27. <version>${qiniu.version}</version>
  28. </dependency>
  29. <!-- 七牛云 sdk 必须需要 okhttp 客户端 -->
  30. <dependency>
  31. <groupId>com.squareup.okhttp3</groupId>
  32. <artifactId>okhttp</artifactId>
  33. <version>3.14.4</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.projectlombok</groupId>
  37. <artifactId>lombok</artifactId>
  38. <optional>true</optional>
  39. </dependency>
  40. </dependencies>
  41. ```
  42. ### 1.2.七牛云配置类
  43. ```java
  44. @Data
  45. @ConfigurationProperties(prefix = "qiniu")
  46. public class QiniuProperties {
  47. private String accessKey;
  48. private String secretKey;
  49. private String bucket;
  50. private String prefix;
  51. }
  52. ```
  53. ### 1.3.自动装配类
  54. ```java
  55. @Configuration
  56. @ConditionalOnClass({Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class})
  57. @ConditionalOnProperty(prefix = "spring.http.multipart", name = "enabled", matchIfMissing = true)
  58. @EnableConfigurationProperties({MultipartProperties.class, QiniuProperties.class})
  59. @RequiredArgsConstructor(onConstructor_ = @Autowired)
  60. public class UploadAutoConfiguration {
  61. private final MultipartProperties multipartProperties;
  62. private final QiniuProperties qiniuProperties;
  63. /**
  64. * 上传配置
  65. */
  66. @Bean
  67. @ConditionalOnMissingBean
  68. public MultipartConfigElement multipartConfigElement() {
  69. return this.multipartProperties.createMultipartConfig();
  70. }
  71. /**
  72. * 注册解析器
  73. */
  74. @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
  75. @ConditionalOnMissingBean(MultipartResolver.class)
  76. public StandardServletMultipartResolver multipartResolver() {
  77. StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
  78. multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
  79. return multipartResolver;
  80. }
  81. /**
  82. * 华东机房
  83. */
  84. @Bean
  85. public com.qiniu.storage.Configuration qiniuConfig() {
  86. return new com.qiniu.storage.Configuration(Region.region0());
  87. }
  88. /**
  89. * 构建一个七牛上传工具实例
  90. */
  91. @Bean
  92. public UploadManager uploadManager() {
  93. return new UploadManager(qiniuConfig());
  94. }
  95. /**
  96. * 认证信息实例
  97. */
  98. @Bean
  99. public Auth auth() {
  100. return Auth.create(qiniuProperties.getAccessKey(), qiniuProperties.getSecretKey());
  101. }
  102. /**
  103. * 构建七牛空间管理实例
  104. */
  105. @Bean
  106. public BucketManager bucketManager() {
  107. return new BucketManager(auth(), qiniuConfig());
  108. }
  109. }
  110. ```
  111. ### 1.4.七牛云上传代码
  112. ```java
  113. @Slf4j
  114. @Service
  115. @RequiredArgsConstructor(onConstructor_ = @Autowired)
  116. public class QiNiuService implements InitializingBean {
  117. private final Auth auth;
  118. private final UploadManager uploadManager;
  119. private final QiniuProperties qiniuProperties;
  120. private StringMap putPolicy;
  121. /**
  122. * 七牛云上传文件
  123. *
  124. * @param file 文件
  125. * @return 七牛上传Response
  126. * @throws QiniuException 七牛异常
  127. */
  128. public Response uploadFile(File file) throws QiniuException {
  129. Response response = this.uploadManager.put(file, file.getName(), getUploadToken());
  130. int retry = 0;
  131. while (response.needRetry() && retry < 3) {
  132. response = this.uploadManager.put(file, file.getName(), getUploadToken());
  133. retry++;
  134. }
  135. return response;
  136. }
  137. @Override
  138. public void afterPropertiesSet() {
  139. this.putPolicy = new StringMap();
  140. putPolicy.put("returnBody",
  141. "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"width\":$(imageInfo.width), \"height\":${imageInfo.height}}");
  142. }
  143. /**
  144. * 获取上传凭证
  145. *
  146. * @return 上传凭证
  147. */
  148. private String getUploadToken() {
  149. return this.auth.uploadToken(qiniuProperties.getBucket(), null, 3600, putPolicy);
  150. }
  151. }
  152. ```
  153. ### 1.5.测试Controller及前端页面
  154. > 不是专业前端,就不在 README 献丑了,代码直接参考 `resources/templates/index.html` 即可
  155. ## 2.测试
  156. > 注意:测试七牛云时,需要先在 `application.yml` 中配置 `qiniu.xxx` 相关参数
  157. 启动 `UploadApplication` ,打开浏览器,输入 `http://localhost:8080/demo`
  158. 上传几张图片试试~
  159. ![测试上传](https://static.xkcoding.com/spring-boot-demo/demo-base/demo-base-upload/2022-09-21-083229.png)
  160. ## 3.参考
  161. - [Spring Boot 官方文档之文件上传](https://docs.spring.io/spring-boot/docs/3.0.0-M4/reference/htmlsingle/#howto.spring-mvc.multipart-file-uploads)
  162. - [七牛云官方文档之 Java SDK](https://developer.qiniu.com/kodo/1239/java)
  163. ## 4.特别感谢
  164. - 感谢 [七牛云](https://portal.qiniu.com/signup?utm_source=kaiyuan&utm_media=xkcoding) 提供的免费云存储与 CDN 加速支持