上传文件到七牛云
之前有做过通过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); } }