进入七牛云的网站
com.qiniu qiniu-java-sdk [7.2.0, 7.2.99]
我们主要获取以下几个东西。
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.jpg
- System.out.println("文件名: "+putRet.key);
-
- //七牛返回的文件存储的地址:: Fpzi2N8XoEaw-g8cVLsYlmeir5t9
- System.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();
- }
-
-
-
-
-
- }