进入七牛云的网站
<!--七牛云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.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();
}
}