七牛云图片上传
?進入七牛云的網站
?https://portal.qiniu.com/
<!--七牛云start--> <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>[7.2.0, 7.2.99]</version> </dependency>我們主要獲取以下幾個東西。
1 、AccessKey
2? 、SecretKey
都在這
3? ?、存儲區域:?
4、? 存儲空間名稱:
存儲空間自己起, 存儲區域自選、
5 、訪問域名:? ?如果有自己的域名,可以設置自己的域名。如果沒有,七牛云會送測試域名
private final static String ACCESSKEY; //AccessKey的值private final static String SECRETKEY; //SecretKey的值private final static String BUCKET; // 存儲空間名稱:private final static String DOMAIN; //訪問域名private final static long EXPIRE; //超時時間private final static Configuration CONFIG; //配置存儲區域:Zone.zone2()為華南服務器首先,定義屬性。然后有兩種方法給屬性賦值。一個是通過 @Value和yml ${}的形式進行賦值。
一個是通過properties文件形式賦值。這里使用第二個。
QINIU_AK= 你的AccessKey QINIU_SK= 你的SecretKey QINIU_BUCKET= 你的訪問空間 QINIU_DOMAIN= 你的域名 QINIU_EXPIRE=6000下面的代碼很多,不過我已經把順序調整過了。而且大家只用看一個方法就行了,其他都是調用他。
先看這個方法,其他都是調用而已。
/** @Lhh* @Description: 重新封裝工具類方法* @Date 22:40 2022/4/26* @Param: [image]* @Return: java.lang.String*/public static String uploadIcon(MultipartFile image) {try {//給這個圖片起名字,利用隨機數。并且獲取文件的后綴格式。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 // 設置完整路徑的目的是為了存儲到數據庫。String qiNiUurl = QiniuUtil.uploadMultipartFile(image, name);return qiNiUurl;} catch (Exception e) {e.printStackTrace();return null;}}下面是完整代碼。
其實大概思路就是。
//1.自己給那個圖片生成一個名字 //2.創建auth認證 //3.創建會話token //4.創建uploadManager(文件流,文件名,token) 上傳管理器。這一步返回response就已經完成上傳了。 //5.下面我們只需要獲取圖片在瀏覽器的 完整URL存在數據庫 ,這樣我們就可以管理那個圖片了。 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; //訪問域名private final static long EXPIRE; //超時時間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");//空間名稱BUCKET = propertyUtil.getProperty("QINIU_BUCKET");//訪問域名DOMAIN = propertyUtil.getProperty("QINIU_DOMAIN");EXPIRE = Long.parseLong(propertyUtil.getProperty("QINIU_EXPIRE"));CONFIG = new Configuration(Zone.zone2()); //設置為華南服務器}/*** 獲取認證** @return 認證*/private static Auth getAuth() {return Auth.create(ACCESSKEY, SECRETKEY);}/*** 獲得會話.*boolean override客戶端獲取上傳憑證,true代表覆蓋上傳,false代表普通上傳** @return*/private static String getToken(String key, boolean override) {Auth auth = getAuth();if (override) {// 有四個參數。分別是空間,文件名,有效時長deadline,上傳策略 //auth.uploadToken(qiniuConfig.getBucket(), null, 3600, null);return auth.uploadToken(BUCKET, key);}return auth.uploadToken(BUCKET);}//配置上傳管理器。 傳入服務器名字,也就是上面的 華南。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(".")); //獲取點后綴名}/** @Lhh* @Description: 重新封裝工具類方法* @Date 22:40 2022/4/26* @Param: [image]* @Return: java.lang.String*/public static String uploadIcon(MultipartFile image) {try {//給這個圖片起名字,利用隨機數。并且獲取文件的后綴格式。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 // 設置完整路徑的目的是為了存儲到數據庫。String qiNiUurl = QiniuUtil.uploadMultipartFile(image, name);return qiNiUurl;} catch (Exception e) {e.printStackTrace();return null;}}*** 不覆蓋上傳** @param file 上傳文件* @param key 文件名* @return 文件訪問路徑*/public static String uploadMultipartFile(MultipartFile file, String key) {return uploadMultipartFile(file, key, false);}/*** 上傳文件** @param file 上傳文件* @param key 文件名* @return 文件訪問路徑*/public static String uploadMultipartFile(MultipartFile file, String key, boolean override) {try {byte[] uploadBytes = multipartFileToBytes(file); //把文件轉化為字節數組//當這一步完成時,圖片其實已經上傳到七牛云了,我們可以讓別人輸入地址也直接訪問那張圖片 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);//七牛返回的文件存儲的地址:: Fpzi2N8XoEaw-g8cVLsYlmeir5t9System.out.println("七牛返回的文件存儲的地址: "+putRet.hash);//添加域名StringBuilder builder = new StringBuilder();builder.append(DOMAIN);builder.append(key);String qiNiUurl = builder.toString();// 設置完整路徑String[] icon = qiNiUurl.split("/");//如果前綴不加"http://",后臺在從數據取出來的時候會將域名默認為localhost,導致沒辦法訪問qiNiUurl = "http://" + icon[0] + "//" + icon[1] + "/" + icon[2];// 拼裝后qiNiUurl: http://family.welikedian.com//217230/28852.jpg // 設置完整路徑的目的是為了存儲到數據庫。return qiNiUurl;} catch (QiniuException e) {System.err.println("七牛云上傳圖片失敗");e.printStackTrace();return null;}}//到這為止, 就是一張圖片的上傳代碼。 下面的代碼是本地上傳和多張圖片的上傳。//本地上傳其實沒什么區別, 就是把 Multipart 變成 filePath //應該是這樣 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;}//其實就是變成了數組而已。 //比如下面的就是通過for 遍歷而已。 // 還是調用之前的方法 savePath[i] = uploadMultipartFile(files[i], key[i], override);/*** 不覆蓋上傳多個文件** @param files 文件數組* @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++) {//還是調用之前的那個方法savePath[i] = uploadMultipartFile(files[i], key[i], override);}return savePath;}//這里下面的目前用不到。/*** MultipartFile轉字節數組** @param file 目標文件* @return 字節數組*/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轉化字節數組異常");e.printStackTrace();return null;}}/*** 獲取文件訪問地址** @param fileName 文件云端存儲的名稱* @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);}/*** 用多個字符串組成目錄,最后一個參數作為文件名* @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();}}總結
- 上一篇: 赛事直播软件搭建中解说+连麦的技术架构难
- 下一篇: 机器学习中监督学习是什么?人工智能机器学