因为项目中需要存储的数据主要是图片数据,所以使用阿里云提供的OSS存储,性价比高,也很简便。(本文一步一步操作指导最后成功都有截图)
前提工作:
已经在oss创建了bucket,就是一个项目的意思。
准备好
endpoint。 在下图可以找到
accessKeyId 和accessKeySecret ,建议创建一个子账号,提供的id和secret比较安全,泄露了不会对服务器造成大的破坏。
先准备一张图片,等待上传。
正式开始
创建一个工程:这里有新maven工程文章
controller接受请求
@RequestMapping("uploadImg")
@ResponseBody
public ImgMessage uploadImg(@RequestParam(value = "file", required = false) MultipartFile imgFile){
return testService.saveImg(imgFile);
}
想要获得外网访问地址,阿里云是这么说的
所以来看service,拼接一下字符串返回就好了
public ImgMessage saveImg(MultipartFile file) {
// 创建新实例
AliOssClient client = new AliOssClient();
// 连接需要的信息
client.setAccessKeyId("你的AccessKeyId");
client.setAccessKeySecret("你的AccessKeySecret");
client.setEndpoint("你的Endpoint");
// 返回的文件访问路径
String url = "";
try {
//获取文件的原始名字
String originalfileName = file.getOriginalFilename();
// 按日期存储
//String fileAddress = new Date().toString();
//重新命名文件
String suffix = originalfileName.substring(originalfileName.lastIndexOf(".") + 1);
String fileName = new Date().getTime() + "-img." + suffix;
// 获得文件流
InputStream inputStream = file.getInputStream();
// 上传到OSS
client.putObject("你的BucketName", "自定义路径/" + fileName, inputStream);
url += "http://你的BucketName.你的Endpoint/自定义路径/" + fileName;
System.out.println("下载url是:" + url);
} catch (IOException e) {
e.printStackTrace();
}
// 是否有可访问的地址
if (url.length() < 2) {
return new ImgMessage("fail", null);
}
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("image_src", url);
return new ImgMessage("success", data);
}
然后是用到的自定义消息和封装好的阿里云OSS操作类
ImgMessage
public class ImgMessage {
private String status;
private Map<String,Object> data;
public ImgMessage(String status, Map<String, Object> data) {
this.status = status;
this.data = data;
}
public ImgMessage() {
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Map<String, Object> getData() {
return data;
}
public void setData(Map<String, Object> data) {
this.data = data;
}
}
AliOssClient
public class AliOssClient {
private static final Logger LOGGER = LoggerFactory.getLogger(AliOssClient.class);
private String accessKeyId;
private String accessKeySecret;
private String endpoint;
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
/**
* 上传某个Object
*
* @param bucketName
* @param bucketUrl
* @param inputStream
* @return
*/
public boolean putObject(String bucketName, String bucketUrl, InputStream inputStream) {
OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
try {
// 上传Object.
client.putObject(bucketName, bucketUrl, inputStream);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
client.shutdown();
}
return true;
}
/**
* 删除某个Object
*
* @param bucketName
* @param bucketUrl
* @return
*/
public boolean deleteObject(String bucketName, String bucketUrl) {
OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
try {
// 删除Object.
client.deleteObject(bucketName, bucketUrl);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
client.shutdown();
}
return true;
}
/**
* 删除多个Object
*
* @param bucketName
* @param bucketUrls
* @return
*/
public boolean deleteObjects(String bucketName, List<String> bucketUrls) {
OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
try {
// 删除Object.
DeleteObjectsResult deleteObjectsResult = client.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(bucketUrls));
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
client.shutdown();
}
return true;
}
}