spring boot 整合 七牛云实现图片上传
1.这里我使用的是Maven,先添加七牛云的依赖。
<!-- 七牛云 -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.2.0, 7.2.99]</version>
</dependency>
2.根据七牛云官方Java SDK 来编写qiniuyun图片上传的工具类。
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Client;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import groovy.util.logging.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
/**
* Created by Administrator on 2019/8/15.
*/
@Component
public class QiniuUtils {
@Value("${qiniu.accessKey}")
private String accessKey ;//上传凭证AccessKey
@Value("${qiniu.secretKey}")
private String secretKey ;//上传凭证secretKey
@Value("${qiniu.bucketName}")
private String bucketName ;//存储空间名称
@Value("${qiniu.fileDomain}")
private String fileDomain;//使用的域名
public String getAccessKey() {
return accessKey;
}
public String getSecretKey() {
return secretKey;
}
public String getBucketName() {
return bucketName;
}
public String getFileDomain() {
return fileDomain;
}
private UploadManager uploadManager;
private BucketManager bucketManager;
private Configuration c;
private Client client;
// 密钥配置
private Auth auth;
public Client getClient(){
if (client==null) {
client=new Client(getConfiguration());
}
return client;
}
public BucketManager getBucketManager() {
if (bucketManager == null) {
bucketManager = new BucketManager(getAuth(), getConfiguration());
}
return bucketManager;
}
public UploadManager getUploadManager() {
if (uploadManager == null) {
uploadManager = new UploadManager(getConfiguration());
}
return uploadManager;
}
public Configuration getConfiguration() {
if (c == null) {
Zone z = Zone.zone0();
c = new Configuration(z);
}
return c;
}
public Auth getAuth() {
if (auth == null) {
auth = Auth.create(getAccessKey(), getSecretKey());
}
return auth;
}
//简单上传模式的凭证
public String getUpToken() {
return getAuth().uploadToken(getBucketName());
}
//覆盖上传模式的凭证
public String getUpToken(String fileKey) {
return getAuth().uploadToken(getBucketName(), fileKey);
}
/**
* 将本地文件上传
* @param filePath 本地文件路径
* @param fileKey 上传到七牛后保存的文件路径名称
* @return String
* @throws IOException
*/
public String upload(String filePath, String fileKey) throws IOException {
Response res;
try {
res = getUploadManager().put(filePath, fileKey, getUpToken(fileKey));
// 解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(res.bodyString(), DefaultPutRet.class);
return fileDomain + "/" + putRet.key;
} catch (QiniuException e) {
res = e.response;
e.printStackTrace();
return "上传失败";
}
}
/**
* 上传二进制数据
* @param data
* @param fileKey
* @return String
* @throws IOException
*/
public String upload(byte[] data, String fileKey) throws IOException {
Response res;
try {
res = getUploadManager().put(data, fileKey, getUpToken(fileKey));
// 解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(res.bodyString(), DefaultPutRet.class);
return fileDomain + "/" + putRet.key;
} catch (QiniuException e) {
res = e.response;
e.printStackTrace();
return "上传失败";
}
}
/**
* 上传输入流
* @param inputStream
* @param fileKey
* @return String
* @throws IOException
*/
public String upload(InputStream inputStream, String fileKey) throws IOException {
Response res;
try {
res = getUploadManager().put(inputStream, fileKey, getUpToken(fileKey),null,null);
// 解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(res.bodyString(), DefaultPutRet.class);
return fileDomain + "/" + putRet.key;
} catch (QiniuException e) {
res = e.response;
e.printStackTrace();
return "上传失败";
}
}
/**
* 删除文件
* @param fileKey
* @return
* @throws QiniuException
*/
public boolean delete(String fileKey) throws QiniuException {
Response response = bucketManager.delete(this.getBucketName(), fileKey);
return response.statusCode == 200 ? true:false;
}
/**
* 获取公共空间文件
* @param fileKey
* @return String
*/
public String getFile(String fileKey) throws Exception{
String encodedFileName = URLEncoder.encode(fileKey, "utf-8").replace("+", "%20");
String url = String.format("%s/%s", fileDomain, encodedFileName);
return url;
}
/**
* 获取私有空间文件
* @param fileKey
* @return String
*/
public String getPrivateFile(String fileKey) throws Exception{
String encodedFileName = URLEncoder.encode(fileKey, "utf-8").replace("+", "%20");
String url = String.format("%s/%s", fileDomain, encodedFileName);
Auth auth = Auth.create(accessKey, secretKey);
long expireInSeconds = 3600;//1小时,可以自定义链接过期时间
String finalUrl = auth.privateDownloadUrl(url, expireInSeconds);
return finalUrl;
}
}
注:此实例我是在 配置文件中设置好了 需要的上传凭证AccessKey,SecretKey,bucketName,fileDomain。
#七牛云配置
qiniu:
accessKey: xxxxxx #上传凭证AccessKey
secretKey: xxxxxx #上传凭证secretKey
bucketName: xxx #存储空间名称
fileDomain: www.xxx.* #文件访问域名前缀
在这里我们看到通过注解@Value() 然后填入对应的路径可以将配置文件中设置的值,覆入属性中
@Value("${qiniu.accessKey}")
private String accessKey ;//上传凭证AccessKey
@Value("${qiniu.secretKey}")
private String secretKey ;//上传凭证secretKey
@Value("${qiniu.bucketName}")
private String bucketName ;//存储空间名称
@Value("${qiniu.fileDomain}")
private String fileDomain;//使用的域名
好了,我们先创建一个Controller类。
3.创建controller类。
import com.chengma.devplatform.config.QiniuUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;
/**
* Created by Administrator on 2019/8/15.
*/
@RestController
@RequestMapping("/api")
public class TestQiNiuResource {
@Autowired
QiniuUtils qiniuUtils;
@RequestMapping("/toIndex")
public String index(){
return "img";
}
@ResponseBody
@RequestMapping(value = "/image", method = RequestMethod.POST)
private String postUserInforUpDate(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws IOException {
// 用来获取其他参数
MultipartHttpServletRequest params = ((MultipartHttpServletRequest) request);
String name = params.getParameter("username");
if (!file.isEmpty()) {
FileInputStream fileInputStream = (FileInputStream) file.getInputStream();
String originalFilename = file.getOriginalFilename();
String fileExtend = originalFilename.substring(originalFilename.lastIndexOf("."));
//默认不指定key的情况下,以文件内容的hash值作为文件名
String fileKey = UUID.randomUUID().toString().replace("-", "") + fileExtend;
return qiniuUtils.upload(fileInputStream,fileKey);
}
return "上传失败";
}
}
在此我们的七牛云图片上传已经整合完成了。
ok,那让我们来测试一下吧,我这边是使用postman来模拟的。
4.使用postman测试图片上传
将对应内容填写进去
通过返回的域名加对应路径,我已经可以成功访问上传的图片了。