七牛云实现文件上传
1、注册七牛云
网址:七牛云
注册七牛云的步骤此处不再赘述。注册之后需要实名认证等一系列步骤!
2、 开通对象存储空间
首次会开通OSS、跟着操作步骤一步步走即可。
新建存储空间
选择名称、存储区域、设置访问控制
此处访问控制建议公开,因为之后图片上传后没有公开是无法访问的!
开通后此处会有一个测试域名,等会会用到
3、代码编写
右上角打开开发者中心
选择对象存储
找到java 导入jdk
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.13.0, 7.13.99]</version>
</dependency>
找到文件上传,此处我们使用数据流上传
将代码拷贝到咱们的测试文件中进行测试
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.region0());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;
try {
byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8");
ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
Response response = uploadManager.put(byteInputStream,key,upToken,null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
} catch (UnsupportedEncodingException ex) {
//ignore
}
此处的ak、sk在秘钥管理
bucket 是你创建的空间名称
4、修改代码
@Service
@Data
@Component
@ConfigurationProperties(prefix = "oss")
public class OssUploadServiceImpl implements com.sky.service.OssUploadService {
public String UploadImg(MultipartFile file){
//判断文件类型或者文件大小
String originalFilename = file.getOriginalFilename();
//如果判断没通过抛出异常
if (!originalFilename.endsWith(".png") && !originalFilename.endsWith(".jpg")){
throw new AccountLockedException("文件上传失败!请检查后缀");
}
//如果判断通过再上传文件到OSS
String filePath = PathUtils.generateFilePath(originalFilename);
//String url = UploadOss(file,filePath);
String url = UploadOss(file,filePath);
return url;
}
private String accessKey;
private String secretKey;
private String bucket;
//图片上传操作
private String UploadOss(MultipartFile file, String filePath){
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.autoRegion());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = filePath;
try {
InputStream inputStream = file.getInputStream();
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
Response response = uploadManager.put(inputStream,key,upToken,null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
//拼接七牛云测试域名加上文件名,返回图片链接给前端
return "前文提到的测试域名地址拷贝到此处" + key;
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
} catch (Exception ex) {
//ignore
}
return null;
}
}
此处考虑到文件重名会导致覆盖问题,引入工具类
此工具类根据上传日期拼接文件夹,根据UUID生成文件名并拼接上传文件的后缀
public class PathUtils {
public static String generateFilePath(String fileName){
//根据日期生成路径 2022/1/15/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
String datePath = sdf.format(new Date());
//uuid作为文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//后缀和文件后缀一致
int index = fileName.lastIndexOf(".");
// test.jpg -> .jpg
String fileType = fileName.substring(index);
return new StringBuilder().append(datePath).append(uuid).append(fileType).toString();
}
}