之前有做过通过java上传文件到七牛云中去, 忙着忙着又忙忘了写博客. 从上星期开始坚持写博客, 系统的整理以前收藏的书签, 看过的书, 用到过的技能, 知识点了. 整理整理也好, 用到过, 以后再用, 复习的时候可以直接拿来看.
java 上传文件到七牛云中, 整体来说还是较简单的. 除了一个坑, 七牛云的存储空间缓存问题. 同一个PDF, 同一段代码上传到七牛云上去, 我那个七牛云上的存储空间上的PDF一外链访问就会报此文件已损坏. 踩这个坑花了我一下午时间, 刚开始以为是代码问题, 代码排查完. 相同代码放在朋友电脑上跑, 他自己七牛云创建一个存储空间上传, 然后外链访问就ok的. 这时候我猜是七牛云缓存的原因了. 去七牛云上找, 在CDN那找到刷新领取, 把我那个存储空间的外链域名刷新一下缓存. 结果就ok了. 如下图:
还有在一开始弄CDN域名时候可以设置缓存时间, 或者弄好了后, 可以在空间管理那设置, 如下图
SpringBoot整合七牛云上传文件到七牛云
pom.xml 配置
<!-- 七牛云 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.3.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>7.2.23</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.6.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.qiniu</groupId> <artifactId>happy-dns-java</artifactId> <version>0.1.4</version> <scope>compile</scope> </dependency> <!-- 这导的是我本地lib下的包 --> <dependency> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> <version>1.9.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/okio- 1.9.0.jar</systemPath> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.17</version> </dependency>
application.properties
# 上传到七牛云上的文件最大为200Mb spring.http.multipart.max-file-size=200Mb spring.http.multipart.max-request-size=1000Mb
Controller
//发布接口 要判断当天是否已上传过相同的文件 @RequestMapping(value = "/upload") @ResponseBody public String upload(@RequestParam("multipartFile") MultipartFile multipartFile, HttpServletResponse response, HttpServletRequest request ){
//前后端分离, 前后端跨域 response.setHeader("Access-Control-Allow-Origin", "*"); String appId = request.getHeader("appId"); cdUseNumberManager.setUseNumber(appId,""); Result result = new Result(); result.setCode(ResultCode.FAIL); String originalFilename = multipartFile.getOriginalFilename(); HBYAppUtils hbyAppUtils = new HBYAppUtils(); try{ String endName = originalFilename.split("\.")[1]; String name = endName.toLowerCase(); if (!"pdf".equals(name) && !"txt".equals(name)&& !"docx".equals(name) && !"doc".equals(name) && !"xlsx".equals(name) && !"xls".equals(name)) { result.setMessage("上传格式错误,请重新上传"); return JSONObject.toJSONString(result); } //上传文件 // String fileName = multipartFile.getOriginalFilename().split("\.")[0]; hbyAppUtils.uploadFile(multipartFile.getInputStream(),originalFilename); String urlPath = HBYAppUtils.prefix + originalFilename; result.setCode(ResultCode.SUCCESS); result.setMessage("上传成功"); }catch (Exception e){ System.out.println(e.getMessage()); result.setMessage("系统繁忙,请稍后重试"); return JSONObject.toJSONString(result); } return JSONObject.toJSONString(result); }
HBYAppUtils
public class HBYAppUtils { // Zone为空间的地区 private static final Configuration cfg = new Configuration(Zone.zone0()); //构造一个带指定Zone对象的配置类 private static final UploadManager uploadManager = new UploadManager(cfg); //公钥 private static final String accessKey = ""; //私钥 private static final String secretKey = ""; private static final String bucket = ""; //bucket名(空间名称) //默认不指定key的情况下,以文件内容的hash值作为文件名 // private static final String key = null; private static final Auth auth = Auth.create(accessKey, secretKey);
//外链域名 public static final String prefix = ""; public static int Guid=100; /** * 上传文件,并返回地址
在此抛出异常, 是因为我弄了全局异常处理器 */ public void uploadFile(InputStream file, String fileName) throws Exception { String upToken = auth.uploadToken(bucket); //文件上传 Response response = uploadManager.put(file, fileName, upToken, null, null); //解析上传成功的结果 DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); } }