首先得去七牛云注冊(cè)賬號(hào),然后去控制臺(tái)創(chuàng)建存儲(chǔ)空間

6.png
這里申請(qǐng)的是測試域名,所以只有30天的有效期,到期了圖片就會(huì)被清除。所以只是供我們玩一下,真正的開發(fā)得用自己的域名。
接下來就是申請(qǐng)AK和SK,在個(gè)人中心

7.png
做好了這些準(zhǔn)備,那么就可以開始寫代碼了。
我這里使用的是SpringBoot,這樣可以省去很多配置,在這個(gè)項(xiàng)目中,幾乎是零配置。
圖片上傳,這里需要兩個(gè)jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.2.7</version>
</dependency>
接下來就開始擼代碼了。
首先創(chuàng)建一個(gè)html頁面
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/testUpload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">上傳</button>
</form>
</body>
</html>
最簡單原始。但這里還是有兩個(gè)注意的地方,一個(gè)是method屬性,一個(gè)是enctype屬性。
接下來就是FileUtil.java
public class FileUtil {
// 圖片允許的后綴擴(kuò)展名
public static String[] IMAGE_FILE_EXTD = new String[] { "png", "bmp", "jpg", "jpeg","pdf" };
public static boolean isFileAllowed(String fileName) {
for (String ext : IMAGE_FILE_EXTD) {
if (ext.equals(fileName)) {
return true;
}
}
return false;
}
}
這個(gè)類只有一個(gè)簡單的方法,那就是判斷圖片的后綴是否符合要求。
接下來寫QiniuService.java
@Service
public class QiniuService {
private static final Logger logger = LoggerFactory.getLogger(QiniuService.class);
// 設(shè)置好賬號(hào)的ACCESS_KEY和SECRET_KEY
String ACCESS_KEY = "###################";
String SECRET_KEY = "###################";
// 要上傳的空間
String bucketname = "####";
// 密鑰配置
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
// 構(gòu)造一個(gè)帶指定Zone對(duì)象的配置類,不同的七云牛存儲(chǔ)區(qū)域調(diào)用不同的zone
Configuration cfg = new Configuration(Zone.zone0());
// ...其他參數(shù)參考類注釋
UploadManager uploadManager = new UploadManager(cfg);
// 測試域名,只有30天有效期
private static String QINIU_IMAGE_DOMAIN = "http://############/";
// 簡單上傳,使用默認(rèn)策略,只需要設(shè)置上傳的空間名就可以了
public String getUpToken() {
return auth.uploadToken(bucketname);
}
public String saveImage(MultipartFile file) throws IOException {
try {
int dotPos = file.getOriginalFilename().lastIndexOf(".");
if (dotPos < 0) {
return null;
}
String fileExt = file.getOriginalFilename().substring(dotPos + 1).toLowerCase();
// 判斷是否是合法的文件后綴
if (!FileUtil.isFileAllowed(fileExt)) {
return null;
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
// 調(diào)用put方法上傳
Response res = uploadManager.put(file.getBytes(), fileName, getUpToken());
// 打印返回的信息
if (res.isOK() && res.isJson()) {
// 返回這張存儲(chǔ)照片的地址
return QINIU_IMAGE_DOMAIN + JSONObject.parseObject(res.bodyString()).get("key");
} else {
logger.error("七牛異常:" + res.bodyString());
return null;
}
} catch (QiniuException e) {
// 請(qǐng)求失敗時(shí)打印的異常的信息
logger.error("七牛異常:" + e.getMessage());
return null;
}
}
}
這里需要填的地方我都用#########標(biāo)注了,要注意的是Zone.zone0()這個(gè)方法,因?yàn)槟銊?chuàng)建的存儲(chǔ)空間可能是華北的,華東的或者其他區(qū)域的,所以這里可能得調(diào)用zone1或者zone2。具體視情況而定。
最后當(dāng)然就是controller了。
@Controller
public class TestController {
@Autowired
private QiniuService qiniuService;
@RequestMapping(value = "/testUpload", method = RequestMethod.POST)
@ResponseBody
public String uploadImage(@RequestParam("file") MultipartFile file,HttpServletRequest request) {
if(file.isEmpty()) {
return "error";
}
try {
String fileUrl=qiniuService.saveImage(file);
return "success, imageUrl = " + fileUrl;
} catch (IOException e) {
e.printStackTrace();
}
return "fail";
}
}
上傳成功,則返回圖片的地址。
啟動(dòng)SpringBoot項(xiàng)目,輸入地址

9.png
選擇一張圖片點(diǎn)擊上傳,發(fā)現(xiàn)返回success和圖片的url。

8.png
去七牛云存儲(chǔ)空間看內(nèi)容管理,發(fā)現(xiàn)圖片已經(jīng)上傳到了七牛云。

10.png