七牛云图片上传
?進(jìn)入七牛云的網(wǎng)站
?https://portal.qiniu.com/
<!--七牛云start--> <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>[7.2.0, 7.2.99]</version> </dependency>我們主要獲取以下幾個(gè)東西。
1 、AccessKey
2? 、SecretKey
都在這
3? ?、存儲(chǔ)區(qū)域:?
4、? 存儲(chǔ)空間名稱(chēng):
存儲(chǔ)空間自己起, 存儲(chǔ)區(qū)域自選、
5 、訪問(wèn)域名:? ?如果有自己的域名,可以設(shè)置自己的域名。如果沒(méi)有,七牛云會(huì)送測(cè)試域名
private final static String ACCESSKEY; //AccessKey的值private final static String SECRETKEY; //SecretKey的值private final static String BUCKET; // 存儲(chǔ)空間名稱(chēng):private final static String DOMAIN; //訪問(wèn)域名private final static long EXPIRE; //超時(shí)時(shí)間private final static Configuration CONFIG; //配置存儲(chǔ)區(qū)域:Zone.zone2()為華南服務(wù)器首先,定義屬性。然后有兩種方法給屬性賦值。一個(gè)是通過(guò) @Value和yml ${}的形式進(jìn)行賦值。
一個(gè)是通過(guò)properties文件形式賦值。這里使用第二個(gè)。
QINIU_AK= 你的AccessKey QINIU_SK= 你的SecretKey QINIU_BUCKET= 你的訪問(wèn)空間 QINIU_DOMAIN= 你的域名 QINIU_EXPIRE=6000下面的代碼很多,不過(guò)我已經(jīng)把順序調(diào)整過(guò)了。而且大家只用看一個(gè)方法就行了,其他都是調(diào)用他。
先看這個(gè)方法,其他都是調(diào)用而已。
/** @Lhh* @Description: 重新封裝工具類(lèi)方法* @Date 22:40 2022/4/26* @Param: [image]* @Return: java.lang.String*/public static String uploadIcon(MultipartFile image) {try {//給這個(gè)圖片起名字,利用隨機(jī)數(shù)。并且獲取文件的后綴格式。String name = QiniuUtil.getNewName(RandomUtil.getRandomNum(), RandomUtil.getRandomNum()) + QiniuUtil.getSuffix(image);System.out.println("文件路徑:"+name); //文件名路徑: /217230/28852.jpg// 拼裝后qiNiUurl: http://family.welikedian.com//217230/28852.jpg // 設(shè)置完整路徑的目的是為了存儲(chǔ)到數(shù)據(jù)庫(kù)。String qiNiUurl = QiniuUtil.uploadMultipartFile(image, name);return qiNiUurl;} catch (Exception e) {e.printStackTrace();return null;}}下面是完整代碼。
其實(shí)大概思路就是。
//1.自己給那個(gè)圖片生成一個(gè)名字 //2.創(chuàng)建auth認(rèn)證 //3.創(chuàng)建會(huì)話token //4.創(chuàng)建uploadManager(文件流,文件名,token) 上傳管理器。這一步返回response就已經(jīng)完成上傳了。 //5.下面我們只需要獲取圖片在瀏覽器的 完整URL存在數(shù)據(jù)庫(kù) ,這樣我們就可以管理那個(gè)圖片了。 package com.tuorong.family.common.util;import com.google.gson.Gson; import com.qiniu.common.QiniuException; import com.qiniu.common.Zone; import com.qiniu.http.Response; import com.qiniu.storage.Configuration; import com.qiniu.storage.UploadManager; import com.qiniu.storage.model.DefaultPutRet; import com.qiniu.util.Auth; import com.tuorong.family.common.constant.FileConstant; import org.springframework.web.multipart.MultipartFile;import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder;public class QiniuUtil {private final static String ACCESSKEY; //AccessKey的值private final static String SECRETKEY; //SecretKey的值private final static String BUCKET; //空間名private final static String DOMAIN; //訪問(wèn)域名private final static long EXPIRE; //超時(shí)時(shí)間private final static Configuration CONFIG;public static String getDOMAIN() {return DOMAIN;}static {PropertyUtil propertyUtil = new PropertyUtil("配置文件位置");ACCESSKEY = propertyUtil.getProperty("QINIU_AK");SECRETKEY = propertyUtil.getProperty("QINIU_SK");//空間名稱(chēng)BUCKET = propertyUtil.getProperty("QINIU_BUCKET");//訪問(wèn)域名DOMAIN = propertyUtil.getProperty("QINIU_DOMAIN");EXPIRE = Long.parseLong(propertyUtil.getProperty("QINIU_EXPIRE"));CONFIG = new Configuration(Zone.zone2()); //設(shè)置為華南服務(wù)器}/*** 獲取認(rèn)證** @return 認(rèn)證*/private static Auth getAuth() {return Auth.create(ACCESSKEY, SECRETKEY);}/*** 獲得會(huì)話.*boolean override客戶(hù)端獲取上傳憑證,true代表覆蓋上傳,false代表普通上傳** @return*/private static String getToken(String key, boolean override) {Auth auth = getAuth();if (override) {// 有四個(gè)參數(shù)。分別是空間,文件名,有效時(shí)長(zhǎng)deadline,上傳策略 //auth.uploadToken(qiniuConfig.getBucket(), null, 3600, null);return auth.uploadToken(BUCKET, key);}return auth.uploadToken(BUCKET);}//配置上傳管理器。 傳入服務(wù)器名字,也就是上面的 華南。public static UploadManager uploadManager() {return new UploadManager(CONFIG); }/*** 獲取原文件的文件后綴名* @param file 原文件*/public static String getSuffix(MultipartFile file ){System.out.println("獲取原文件的文件后綴名");String oldName = file.getOriginalFilename();return oldName.substring(oldName.indexOf(".")); //獲取點(diǎn)后綴名}/** @Lhh* @Description: 重新封裝工具類(lèi)方法* @Date 22:40 2022/4/26* @Param: [image]* @Return: java.lang.String*/public static String uploadIcon(MultipartFile image) {try {//給這個(gè)圖片起名字,利用隨機(jī)數(shù)。并且獲取文件的后綴格式。String name = QiniuUtil.getNewName(RandomUtil.getRandomNum(), RandomUtil.getRandomNum()) + QiniuUtil.getSuffix(image);System.out.println("文件路徑:"+name); //文件名路徑: /217230/28852.jpg// 拼裝后qiNiUurl: http://family.welikedian.com//217230/28852.jpg // 設(shè)置完整路徑的目的是為了存儲(chǔ)到數(shù)據(jù)庫(kù)。String qiNiUurl = QiniuUtil.uploadMultipartFile(image, name);return qiNiUurl;} catch (Exception e) {e.printStackTrace();return null;}}*** 不覆蓋上傳** @param file 上傳文件* @param key 文件名* @return 文件訪問(wèn)路徑*/public static String uploadMultipartFile(MultipartFile file, String key) {return uploadMultipartFile(file, key, false);}/*** 上傳文件** @param file 上傳文件* @param key 文件名* @return 文件訪問(wèn)路徑*/public static String uploadMultipartFile(MultipartFile file, String key, boolean override) {try {byte[] uploadBytes = multipartFileToBytes(file); //把文件轉(zhuǎn)化為字節(jié)數(shù)組//當(dāng)這一步完成時(shí),圖片其實(shí)已經(jīng)上傳到七牛云了,我們可以讓別人輸入地址也直接訪問(wèn)那張圖片 Response response = uploadManager().put(uploadBytes, key, getToken(key, override)); DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);// 文件名: /217230/28852.jpgSystem.out.println("文件名: "+putRet.key);//七牛返回的文件存儲(chǔ)的地址:: Fpzi2N8XoEaw-g8cVLsYlmeir5t9System.out.println("七牛返回的文件存儲(chǔ)的地址: "+putRet.hash);//添加域名StringBuilder builder = new StringBuilder();builder.append(DOMAIN);builder.append(key);String qiNiUurl = builder.toString();// 設(shè)置完整路徑String[] icon = qiNiUurl.split("/");//如果前綴不加"http://",后臺(tái)在從數(shù)據(jù)取出來(lái)的時(shí)候會(huì)將域名默認(rèn)為localhost,導(dǎo)致沒(méi)辦法訪問(wèn)qiNiUurl = "http://" + icon[0] + "//" + icon[1] + "/" + icon[2];// 拼裝后qiNiUurl: http://family.welikedian.com//217230/28852.jpg // 設(shè)置完整路徑的目的是為了存儲(chǔ)到數(shù)據(jù)庫(kù)。return qiNiUurl;} catch (QiniuException e) {System.err.println("七牛云上傳圖片失敗");e.printStackTrace();return null;}}//到這為止, 就是一張圖片的上傳代碼。 下面的代碼是本地上傳和多張圖片的上傳。//本地上傳其實(shí)沒(méi)什么區(qū)別, 就是把 Multipart 變成 filePath //應(yīng)該是這樣 Path filePath =new File("本地路徑"); /*** 上傳本地文件** @param key 文件名* @param filePath 文件路徑* @return 七牛云保存的key*/public static String uploadFile(String key, String filePath) {return uploadFile(key, filePath, false);}/*** 上傳本地文件** @param key 文件名* @param filePath 文件路徑* @param override 是否選擇覆蓋* @return 七牛云保存的key*/public static String uploadFile(String key, String filePath, boolean override) {UploadManager uploadManager = new UploadManager(CONFIG);try {Response response = uploadManager.put(filePath, key, getToken(key, override));DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);return getVistURrl(putRet.key);} catch (QiniuException e) {Response r = e.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}return null;}//其實(shí)就是變成了數(shù)組而已。 //比如下面的就是通過(guò)for 遍歷而已。 // 還是調(diào)用之前的方法 savePath[i] = uploadMultipartFile(files[i], key[i], override);/*** 不覆蓋上傳多個(gè)文件** @param files 文件數(shù)組* @param key 文件名* @return*/public static String[] uploadMulFiles(MultipartFile[] files, String[] key) {return uploadMulFiles(files, key, false);}/*** 上傳多張圖片** @param files* @param key* @param override* @return*/public static String[] uploadMulFiles(MultipartFile[] files, String[] key, boolean override) {String[] savePath = new String[files.length];for (int i = 0; i < files.length; i++) {//還是調(diào)用之前的那個(gè)方法savePath[i] = uploadMultipartFile(files[i], key[i], override);}return savePath;}//這里下面的目前用不到。/*** MultipartFile轉(zhuǎn)字節(jié)數(shù)組** @param file 目標(biāo)文件* @return 字節(jié)數(shù)組*/private static byte[] multipartFileToBytes(MultipartFile file) {try {InputStream in = file.getInputStream();;ByteArrayOutputStream bos = new ByteArrayOutputStream();;byte[] bytes = new byte[1024];int len = -1;while ((len = in.read(bytes)) != -1) {bos.write(bytes, 0, len);}return bos.toByteArray();} catch (IOException e) {System.err.println("MultipartFile轉(zhuǎn)化字節(jié)數(shù)組異常");e.printStackTrace();return null;}}/*** 獲取文件訪問(wèn)地址** @param fileName 文件云端存儲(chǔ)的名稱(chēng)* @return* @throws UnsupportedEncodingException*/public static String fileUrl(String fileName) throws UnsupportedEncodingException {String encodedFileName = URLEncoder.encode(fileName, "utf-8");String publicUrl = String.format("%s/%s", DOMAIN, encodedFileName);Auth auth = getAuth();long expireInSeconds = EXPIRE;if (-1 == expireInSeconds) {return auth.privateDownloadUrl(publicUrl);}return auth.privateDownloadUrl(publicUrl, expireInSeconds);}/*** 用多個(gè)字符串組成目錄,最后一個(gè)參數(shù)作為文件名* @param directory*/public static String getNewName(String... directory) {StringBuilder builder = new StringBuilder();// builder.append(FileConstant.BASH_NAME);for (String s : directory) {builder.append("/");builder.append(s);}return builder.toString();}}總結(jié)
- 上一篇: 赛事直播软件搭建中解说+连麦的技术架构难
- 下一篇: 机器学习中监督学习是什么?人工智能机器学