阿里雲對象存儲服務(Object Storage Service,簡稱 OSS)提供基於網絡的數據存取服務。使用 OSS,可以通過網絡隨時存儲和調用包括文本、圖片、音頻和視頻等在內的各種非結構化數據文件。具有:1、易用性:簡單易用,便於管理,深度集成數據處理服務;2、高可靠:多重冗余備份,服務設計可用性不低於99.99%;3、強安全:多層次安全防護,支持跨區域復制、異地容災機制;4、低成本:總體TCO更低,生命周期管理進一步降低成本等特點。
在實現之前首先要購買阿里雲對象存儲OSS資源包並創建了Bucket。這里不詳細介紹,只介紹實現的代碼。
前端實現比較簡單,可以采用插件,有layui,bootstrap-fileinput等優秀插件,這里使用layui。
前端代碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>upload</title> <link rel="stylesheet" href="/static/build/layui.css" media="all"> </head> <body> <button type="button" class="layui-btn" id="test1"> <i class="layui-icon"></i>上傳圖片 </button> <script src="/static/build/layui.js"></script> <script> layui.use('upload', function(){ var upload = layui.upload; //執行實例 var uploadInst = upload.render({ elem: '#test1' //綁定元素 ,url: '/upload/' //上傳接口 ,done: function(res){ //上傳完畢回調,拿到路徑(res.data)自己選擇是在頁面顯示圖片還是顯示路徑。 } ,error: function(){ //請求異常回調,自己根據需求來寫錯誤提示以及下一步邏輯。 } }); }); </script> </body> </html>
后端接口:
@RequestMapping(value="/upload") @ResponseBody public JsonResult upload(MultipartFile file, HttpServletRequest request) { if (!file.isEmpty()) { try { SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 生成文件名稱 String nameSuffix = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf(".")) .replaceAll(" ", "_").replaceAll(",", "") + format.format(DateUtil.date()) + new Random().nextInt(1000); //上傳原始圖片到阿里雲 String uploadPath = ossFileUtil.uploadAliyun(file,nameSuffix); return new JsonResult(true, "上傳成功",uploadPath); } catch (Exception e) { log.error("上傳附件錯誤" + e.getMessage()); return new JsonResult(false, "系統未知錯誤"); } } else { return new JsonResult(false, "文件不能為空"); } }
JsonResult工具類:
public class JsonResult { private boolean flag; private String msg; private Object data; public JsonResult() { super(); } public JsonResult(boolean flag, String msg) { super(); this.flag = flag; this.msg = msg; } public JsonResult(boolean flag, String msg, Object data) { super(); this.flag = flag; this.msg = msg; this.data = data; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
上傳圖片到阿里雲工具類:
<!-- 阿里雲oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency>
public class ossFileUtil { public String uploadAliyun(MultipartFile file,String fileName) throws IOException { // 1 獲取上傳需要的固定值 String endpoint ="oss-cn-shanghai.aliyuncs.com"; //你的站點 String accessKeyId = "<yourAccessKeyId>"; //你的acess_key_id String accessKeySecret = "<yourAccessKeySecret>"; //你的acess_key_secret String bucketName = "<yourBucketName>"; //你的bucket_name //外面獲取文件輸入流,最后方便關閉 InputStream in = file.getInputStream(); try { //2 創建OssClient對象 OSS ossClient =new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret); //3 獲取文件信息,為了上傳 // meta設置請求頭 ObjectMetadata meta = new ObjectMetadata(); meta.setContentType("image/jpg"); //4 設置知道文件夾 ossClient.putObject(bucketName,fileName,in, meta); //5 關閉ossClient ossClient.shutdown(); //6 返回上傳之后地址,拼接地址 String uploadUrl = "https://"+bucketName+"."+endpoint+"/"+fileName; return uploadUrl; }catch(Exception e) { e.printStackTrace(); return null; }finally { in.close(); } } }