首先在七牛云注册,然后选择对象存储,按照以下配置:
我的存储地区是华南-广东,注意这个如果选择不一样,后面的代码调用会有一点区别,访问控制选择公开,不然回显的外链无法访问。
记住这个空间名称和那个域名地址,后面会有用。
点击左上角的头像,选择秘钥管理,一般是有两组,一组两个,随便选一个,这个AK和SK在后面也会有用。
接下来是后端代码,首先是pom.xml,在dependencies中添加如下配置
<!--七牛云OOS-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.13.0, 7.13.99]</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
我们需要利用一个工具类来对上传的文件重命名,可以在项目中新建一个utils包,然后建PathUtils类,复制下面代码:
package com.example.memohehang.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
//对原始文件名进行修改文件名,并修改存放目录
public class PathUtils
{
public static String generateFilePath(String fileName)
{
//根据日期生成路径
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();
}
}
然后再application.yml中添加以下配置:
# 打开七牛云,找到密钥管理,把相关信息填写到下面3行
myoss:
accessKey: yourAK
secretKey: yourSK
bucket: yourname
然后是OssUploadService:
package com.example.memohehang.service;
import com.example.memohehang.common.R;
import org.springframework.web.multipart.MultipartFile;
public interface OssUploadService {
//图片上传到七牛云
R uploadImg(MultipartFile img);//R为封装的返回类型,替换成你自己的
}
OssUploadServiceImpl:
package com.example.memohehang.service.Impl;
import com.example.memohehang.common.R;
import com.example.memohehang.service.OssUploadService;
import com.example.memohehang.utils.PathUtils;
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 lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
@Service
@Data//为成员变量生成get和set方法
@ConfigurationProperties(prefix = "myoss")
//把文件上传到七牛云
public class OssUploadServiceImpl implements OssUploadService {
@Override
//MultipartFile是spring提供的接口
public R uploadImg(MultipartFile img) {
//获取原始文件名
String originalFilename = img.getOriginalFilename();
// 获取文件大小
long fileSize = img.getSize();
//PathUtils.generateFilePath(originalFilename)表示把原始文件名转换成指定文件名
String filePath = PathUtils.generateFilePath(originalFilename);
//下面用于调用的uploadOss方法返回的必须是String类型
String url = uploadOss(img,filePath);
System.out.println("外链地址:"+url);
//把得到的外链地址返回给前端
return R.success(200,"操作成功",url);
}
//----------------------------------上传文件到七牛云----------------------------------------
//注意要从application.yml读取属性数据,下面的3个成员变量的名字必须对应application.yml的myoss属性的三个子属性名字
private String accessKey;
private String secretKey;
private String bucket;
//上传文件的具体代码。MultipartFile是spring提供的接口,作用是实现文件上传
private String uploadOss(MultipartFile imgFile, String filePath){
//构造一个带指定 Region 对象的配置类。你的七牛云OSS创建的是哪个区域的,那么就调用Region的什么方法即可
Configuration cfg = new Configuration(Region.huanan());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
UploadManager uploadManager = new UploadManager(cfg);
//打开七牛云,把鼠标悬浮在右上角的个人头像,然后就会看到'密钥管理',点击进入就有你的密钥,把其中的AK和SK复制到下面两行
//String accessKey = "_ibGP9wytjLCAZPqcFaWQNxbw7fMUvofSOvOFFR3";
//String secretKey = "QSOAU-cv3sSDGNfVNPF6iXz-PsP5X9QTrjFI9zYw";
//String bucket = "hehang-blog";
//为避免上面3行暴露信息,我们会把信息写到application.yml里面,然后添加ConfigurationProperties注解、3个成员变量即可读取
//文件名,如果写成null的话,就以文件内容的hash值作为文件名
String key = filePath;
try {
//byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8");
//ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);
//上面两行是官方写的(注释掉),下面那几行是我们写的
//把前端传过来的文件转换成InputStream对象
InputStream xxinputStream = imgFile.getInputStream();
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
//把前端传过来的xxinputStream图片上传到七牛云
Response response = uploadManager.put(xxinputStream,key,upToken,null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println("上传成功! 生成的key是: "+putRet.key);
System.out.println("上传成功! 生成的hash是: "+putRet.hash);
return "http://s6422okdy.hn-bkt.clouddn.com/"+key;//注意这个地方替换成自己的域名,http://不能掉
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
}catch (Exception e) {
//ignore
}
return "上传失败";
}
}
这里注意把回显域名替换成你自己的,返回类型替换即可,注意不要删除其他配置文件,若IDEA报错则把鼠标放在报错的地方,根据提示导入对应的包即可
最后是UploadController
package com.example.memohehang.controller;
import com.example.memohehang.common.R;
import com.example.memohehang.service.OssUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
public class UploadController
{
@Autowired
private OssUploadService ossUploadService;
@PostMapping("/upload")
public R uploadImg(MultipartFile img)
{
return ossUploadService.uploadImg(img);
}
}
对应的回显链接可以直接在前端调用,注意返回的字符串需要在前端转成JSON格式