之前有做過通過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); } }