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