因为项目中需要存储的数据主要是图片数据,所以使用阿里云提供的OSS存储,性价比高,也很简便。(本文一步一步操作指导最后成功都有截图)
前提工作:
已经在oss创建了bucket,就是一个项目的意思。并且设置公共读,maven依赖搜索aliyun oss第一个添加到pom
准备好
endpoint。 在下图可以找到
accessKeyId 和accessKeySecret ,建议创建一个子账号,提供的id和secret比较安全,泄露了不会对服务器造成大的破坏。
先准备一张图片,等待上传。
正式开始
创建一个工程:这里有新maven工程文章
controller接受请求
@RequestMapping("uploadImg")@ResponseBodypublic 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();// 上传到OSSclient.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;}}