篇首语:本文由编程笔记#小编为大家整理,主要介绍了Springboot上传文件--对象存储相关的知识,希望对你有一定的参考价值。
官方文档
<dependency>
<groupId>com.qiniugroupId>
<artifactId>qiniu-java-sdkartifactId>
<version>[7.7.0, 7.7.99]version>
dependency>
<dependency>
<groupId>com.squareup.okhttp3groupId>
<artifactId>okhttpartifactId>
<version>3.14.2version>
<scope>compilescope>
dependency>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.8.5version>
<scope>compilescope>
dependency>
<dependency>
<groupId>com.qiniugroupId>
<artifactId>happy-dns-javaartifactId>
<version>0.1.6version>
<scope>testscope>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
JAVA SDK依赖和SDK依赖的第三方库都需要导入项目中&#xff0c;两者缺一不可
&#64;Test
public void testPrint() {
//构造一个带指定 Region 对象的配置类
//Region.region2()对应创建的空间区域&#xff0c;刚刚创建空间我使用了华南&#xff0c;对应region2();
Configuration cfg &#61; new Configuration(Region.region2());
//...其他参数参考类注释
UploadManager uploadManager &#61; new UploadManager(cfg);
//...生成上传凭证&#xff0c;然后准备上传
String accessKey &#61; "BITG3xjH_kr2w7uxDiMW1udeIthyJqhLENtf-4Ks";
String secretKey &#61; "yjrgG_1AhJVQt4fFrb4Vd5y6Lslz7ba06fv-gaPR";
String bucket &#61; "dxj1016";//空间名称
//如果是Windows情况下&#xff0c;格式是 D:\\\\qiniu\\\\test.png;本地文件路径
String localFilePath &#61; "D:\\\\赵丽颖\\\\微信图片_20200924135429.jpg";
//默认不指定key的情况下&#xff0c;以文件内容的hash值作为文件名
String key &#61; null;
Auth auth &#61; Auth.create(accessKey, secretKey);
String upToken &#61; auth.uploadToken(bucket);
try {
Response response &#61; uploadManager.put(localFilePath, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet &#61; new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
} catch (QiniuException ex) {
Response r &#61; ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
}
两个安全秘钥&#xff1a;
configuration里面的参数&#xff1a;创建空间的时候选的哪个区域就对应这里的方法&#xff0c;我的刚刚创建空间的时候选择的是华南&#xff0c;所以这里使用了region2()方法
9. 测试看文件是否上传到七牛云
public class MyUtil {
/**
* 文件上传到七牛云
* &#64;return
*/
public static String testPrint(MultipartFile pictureFile) throws IOException {
//构造一个带指定 Region 对象的配置类
//Region.region2()对应创建的空间区域&#xff0c;刚刚创建空间我使用了华南&#xff0c;对应region2();
Configuration cfg &#61; new Configuration(Region.region2());
//...其他参数参考类注释
UploadManager uploadManager &#61; new UploadManager(cfg);
//...生成上传凭证&#xff0c;然后准备上传
String accessKey &#61; "BITG3xjH_kr2w7uxDiMW1udeIthyJqhLENtf-4Ks";
String secretKey &#61; "yjrgG_1AhJVQt4fFrb4Vd5y6Lslz7ba06fv-gaPR";
String bucket &#61; "dxj1016";//空间名称
//如果是Windows情况下&#xff0c;格式是 D:\\\\qiniu\\\\test.png;本地文件路径
// String localFilePath &#61; "D:\\\\赵丽颖\\\\微信图片_20200924135429.jpg";
InputStream inputStream &#61; pictureFile.getInputStream();
//默认不指定key的情况下&#xff0c;以文件内容的hash值作为文件名
String key &#61; null;
Auth auth &#61; Auth.create(accessKey, secretKey);
String upToken &#61; auth.uploadToken(bucket);
try {
Response response &#61; uploadManager.put(inputStream, key, upToken,null,null);
//解析上传成功的结果
DefaultPutRet putRet &#61; new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
String url &#61; "http://qu6hzlc6e.hn-bkt.clouddn.com/" &#43; putRet.hash;
return url;
} catch (QiniuException ex) {
Response r &#61; ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return null;
}
}
这里参数为MultipartFile&#xff0c;如果是简单上传那里使用文件路径Response response &#61; uploadManager.put(localFilePath, key, upToken);那么参数无法获取文件路径&#xff0c;所以查看put源码可以知道&#xff0c;还有一个方法是使用inputStream参数的 Response response &#61; uploadManager.put(inputStream, key, upToken,null,null);
package com.spring.campus_express_delivery.controller;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.spring.campus_express_delivery.entity.Users;
import com.spring.campus_express_delivery.util.JwtToken;
import com.spring.campus_express_delivery.util.MyUtil;
import com.spring.campus_express_delivery.util.ResponseEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
&#64;CrossOrigin
&#64;Controller
&#64;RequestMapping("/test")
&#64;Api(value &#61; "TestObject", description &#61; "文件上传测试")
public class TestObject {
/**
* 修改自己信息接口
* &#64;return
* &#64;throws IOException
*/
&#64;ApiOperation("修改自己信息")
&#64;PostMapping("/web/test_update_info")
&#64;ResponseBody
public String testUpdateUserInfoByMyself(&#64;RequestParam(required &#61; false) MultipartFile pictureFile) throws IOException, ParseException {
String pic &#61; MyUtil.testPrint(pictureFile);
return pic;
}
}
参考资料
工具类
public static String GetImageStr()
{//将图片文件转化为字节数组字符串&#xff0c;并对其进行Base64编码处理
String imgFile &#61; "D:\\\\赵丽颖\\\\微信图片_20200924135436.jpg";//待处理的图片
InputStream in &#61; null;
byte[] data &#61; null;
//读取图片字节数组
try
{
in &#61; new FileInputStream(imgFile);
data &#61; new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
//对字节数组Base64编码
BASE64Encoder encoder &#61; new BASE64Encoder();
return encoder.encode(data);//返回Base64编码过的字节数组字符串
}
public static String GenerateImagebendi(String imgStr)
{ //对字节数组字符串进行Base64解码并生成图片
if (imgStr &#61;&#61; null) //图像数据为空
return null;
BASE64Decoder decoder &#61; new BASE64Decoder();
try
{
//Base64解码
byte[] b &#61; decoder.decodeBuffer(imgStr);
for(int i&#61;0;i<b.length;&#43;&#43;i)
{
if(b[i]<0)
{//调整异常数据
b[i]&#43;&#61;256;
}
}
String imgFilePath &#61; "D:\\\\赵丽颖\\\\"&#43;System.currentTimeMillis() &#43; UUID.randomUUID().toString().replace(".", "").substring(0, 6)&#43;".jpg";//新生成的图片
OutputStream out &#61; new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();
String filePath &#61; testPrint(imgFilePath);//将图片存储到七牛云&#xff0c;返回图片访问链接
return filePath;
}
catch (Exception e)
{
return null;
}
}
public static String testPrint(String localFilePath) {
//构造一个带指定 Region 对象的配置类
//Region.region2()对应创建的空间区域&#xff0c;刚刚创建空间我使用了华南&#xff0c;对应region2();
Configuration cfg &#61; new Configuration(Region.region2());
//...其他参数参考类注释
UploadManager uploadManager &#61; new UploadManager(cfg);
//...生成上传凭证&#xff0c;然后准备上传
String accessKey &#61; "BITG3xjH_kr2w7uxDiMW1udeIthyJqhLENtf-4Ks";
String secretKey &#61; "yjrgG_1AhJVQt4fFrb4Vd5y6Lslz7ba06fv-gaPR";
String bucket &#61; "dxj1016";//空间名称
//如果是Windows情况下&#xff0c;格式是 D:\\\\qiniu\\\\test.png;本地文件路径
//String localFilePath &#61; "D:\\\\赵丽颖\\\\微信图片_20200924135429.jpg";
//默认不指定key的情况下&#xff0c;以文件内容的hash值作为文件名
String key &#61; null;
Auth auth &#61; Auth.create(accessKey, secretKey);
String upToken &#61; auth.uploadToken(bucket);
try {
Response response &#61; uploadManager.put(localFilePath, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet &#61; new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
String url &#61; "http://qu6hzlc6e.hn-bkt.clouddn.com/" &#43; putRet.hash;
return url;
} catch (QiniuException ex) {
Response r &#61; ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return null;
}
&#64;Test
public void testBase() {
String strImg &#61; GetImageStr();
String pic &#61; GenerateImagebendi(strImg);
System.out.println(pic);
}
/*
执行结果&#xff1a;
FnSeVzjrn_pWsww6D500Ore6YmjA
FnSeVzjrn_pWsww6D500Ore6YmjA
http://qu6hzlc6e.hn-bkt.clouddn.com/FnSeVzjrn_pWsww6D500Ore6YmjA
*/
这里为了方便使用了图片转换为base64编码的字符串然后再转换为图片的方式&#xff0c;如果是前端传递过来base64编码的字符串&#xff0c;那么就只要使用14步骤的base64编码的字符串转换为图片方法GenerateImagebendi&#xff0c;将前端传递过来的base64字符串作为参数&#xff0c;进行测试