本来一开始是写把图片上传到七牛云的,然后发现上传后访问图片,需要使用自己的备案的域名(之前的域名过期了),于是转向阿里云OSS。
把七牛云的代码全删了后,写阿里云的,阿里云的写好后,发现阿里云买了储存空间还要买下行流量,而且对于我这样的穷逼来说,有点小贵,于是只好又重新转换七牛云,买了个域名并且重写代码。
配置文件
和阿里云一样首先也是配置文件,比较简单
qiniu:
access-key: your access key
secret-key: your secret key
bucket: your bucket name
配置类
然后是配置类(为了方便写了个配置类用来注入)
/**
* 七牛云配置类
* @create 2019-07-31 16:47
*/
@Configuration
public class QiniuConfig {
@Value("${qiniu.access-key}")
private String accessKey;
@Value("${qiniu.secret-key}")
private String secretKey;
/** 获取七牛云的Configuration */
@Bean
public com.qiniu.storage.Configuration getQiniuConfig() {
return new com.qiniu.storage.Configuration(Zone.zone2());
}
/** 获取Auth */
@Bean
public Auth getAuth() {
return Auth.create(accessKey, secretKey);
}
}
主体代码
public class FileUploadServiceImpl implements FileUploadService {
@Value("${qiniu.access-key}")
private String accessKey;
@Value("${qiniu.secret-key}")
private String secretKey;
@Value("${qiniu.bucket}")
private String bucket;
@Autowired
private Auth auth;
@Autowired
private Configuration configuration;
public Map<String, Object> uploadImage(InputStream inputStream, String suffix) {
UploadManager uploadManager = new UploadManager(configuration);
// 获取一个随机的文件名
String filename = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
// 获取七牛云提供的 token
String upToken = auth.uploadToken(bucket);
// 七牛云用来获取返回信息的相应
Response response;
// 用来获取上传后的图片地址
String picAddr;
try {
response = uploadManager.put(inputStream, filename, upToken, null, null);
// 返回的 response其实是一个 json,转换为 Map,然后其中的 key就是上传的文件名了,其实就是上面生产的 filename
// 由于域名还未备案完成,所以还不能真正得到图片直链访问地址,这里只是得到图片的文件名
picAddr = new Gson().fromJson(response.bodyString(), Map.class).get("key").toString();
} catch (QiniuException e) {
response = e.response;
log.error("【上传服务】上传图片发生出错误!{}", response.toString());
e.printStackTrace();
}
// 这里是前端使用的 editor.md,要求上传图片后的返回格式
Map<String, Object> result = new HashMap<String, Object>(3) {{
put("url", "");
put("success", 1);
put("message", "upload success!");
}};
return result;
}
}
就是利用Configuration
、Auth
和UploadManager
来上传文件和获取上传后的返回信息,使用auth.upToken()
来获取上传需要的token信息,然后uploadManager.put()
来上传文件。