阿里雲上傳圖片
阿新 • • 發佈:2021-12-13
在和一群大佬做react native專案的時候,我負責的是前端的工作。專案中有個功能涉及到圖片的上傳,當時還不清楚什麼是物件儲存。開始看官方文件,學習!GitHub中有react native 阿里雲的sdk,大家有興趣的話可以在GitHub上搜索一下。開始是前端進行物件儲存的工作,這個專案進行了一段時間後,這個工作改為了後端完成(前端做這件事會暴漏key 和 secret,不安全)我向大佬要來了後臺(Java實現)程式碼,簡單把物件儲存的模組剝離出來了,希望能對大家有用處吧(我只是個知識的搬運工哈哈)
需要準備的東西
可以將這些資訊放在一個配置檔案裡面
ossclient.endPoint=oss-cn-beijing.aliyuncs.com ossclient.accessKeyId=你的key ossclient.accessKeySecret=你的secret ossclient.bucketName=bucket的名字 ossclient.folder=圖片存在的資料夾
編碼
程式碼是參照阿里雲官方編寫的 點選檢視,使用SpringBoot框架實現
原始碼可以去我的 GitHub 上clone
- 匹配資訊的類,初始化
package com.skyocean.entity; import com.aliyun.oss.OSSClient; import java.util.ResourceBundle; public class OSSConfigure { private static OSSConfigure ossConfigure; private String endPoint; private String accessKeyId; private String accessKeySecret; private String bucketName; private String folder; private OSSConfigure () { ResourceBundle rb = ResourceBundle.getBundle("OSSClient"); { endPoint = rb.getString("ossclient.endPoint"); accessKeyId = rb.getString("ossclient.accessKeyId"); accessKeySecret = rb.getString("ossclient.accessKeySecret"); bucketName = rb.getString("ossclient.bucketName"); folder = rb.getString("ossclient.folder"); } } private OSSConfigure (String folderNow) { ResourceBundle rb = ResourceBundle.getBundle("OSSClient"); { endPoint = rb.getString("ossclient.endPoint"); accessKeyId = rb.getString("ossclient.accessKeyId"); accessKeySecret = rb.getString("ossclient.accessKeySecret"); bucketName = rb.getString("ossclient.bucketName"); folder = folderNow; } } public static OSSConfigure getOssConfigure() { if (ossConfigure == null) { synchronized (OSSConfigure.class) { if (ossConfigure == null) { ossConfigure = new OSSConfigure(); } } } return ossConfigure; } public static OSSConfigure getOssConfigureSetFolder(String folderNow) { if (ossConfigure == null) { synchronized (OSSConfigure.class) { if (ossConfigure == null) { ossConfigure = new OSSConfigure(folderNow); } } } return ossConfigure; } public String getBucketName() { return bucketName; } public String getFolder() { return folder; } public OSSClient getOSSClient() { return new OSSClient(endPoint, accessKeyId, accessKeySecret); } }
- controller 層編寫
package com.mgl.controller; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.ObjectMetadata; import com.mgl.entry.OSSConfigure; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; @RequestMapping("/pic") @RestController public class PictureController { @PostMapping(value = "/uploadPic") public Map<String, Object> uploadPic( HttpServletRequest request, String title, MultipartFile[] pictures, String description ) { Map<String,Object> map = new HashMap<>(); System.out.println(title); //開始上傳 OSSClient ossClient = null; try { //得到上傳到的資料夾 OSSConfigure ossConfigure = OSSConfigure.getOssConfigureSetFolder("test/"); //建立OSSClient ossClient = ossConfigure.getOSSClient(); //判斷資料夾是否存在,不存在則建立 if (!ossClient.doesObjectExist(ossConfigure.getBucketName(), ossConfigure.getFolder())) { //建立資料夾 ossClient.putObject(ossConfigure.getBucketName(), ossConfigure.getFolder(), new ByteArrayInputStream(new byte[0])); } for (MultipartFile file: pictures ) { String fileExtension = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); String key = ossConfigure.getFolder() +"mgl: "+ System.currentTimeMillis() + fileExtension;//key InputStream fileInput = file.getInputStream(); //建立上傳Object的Metadata ObjectMetadata metadata = new ObjectMetadata(); //上傳的檔案的長度 metadata.setContentLength(fileInput.available()); //指定該Object被下載時的網頁的快取行為 metadata.setCacheControl("no-cache"); //指定該Object下設定Header metadata.setHeader("Pragma", "no-cache"); //設定檔案的上傳名稱 metadata.setContentDisposition("mgl: filename=\"" + System.currentTimeMillis() + "\""); ossClient.putObject(ossConfigure.getBucketName(), key, fileInput); } map.put("msg","success !"); } catch (IOException e) { e.printStackTrace(); map.put("msg","failed !"); } finally { if (ossClient != null) { ossClient.shutdown(); } } return map; } }
- 測試
好了,大功告成,希望能幫到大家,嘿嘿。