图片存储解决方案--阿里云OSS
圖片存儲解決方案
實現圖片上傳服務,需要有存儲的支持,那么我們的解決方案將以下幾種:
直接將圖片保存到服務的硬盤優點:開發便捷,成本低缺點:擴容困難 使用分布式文件系統進行存儲優點:容易實現擴容缺點:開發復雜度稍大(有成熟的產品可以使用,比如:FastDFS) 使用nfs做存儲優點:開發較為便捷缺點:需要有一定的運維知識進行部署和維護 使用第三方的存儲服務優點:開發簡單,擁有強大功能,免維護缺點:付費阿里云OSS存儲
1 什么是OSS服務?
地址:https://www.aliyun.com/product/oss
2、購買服務
使用第三方服務最大的缺點就是需要付費,下面,按照自己的需求購買即可。
3、創建Bucket
使用OSS,首先需要創建Bucket,Bucket翻譯成中文是水桶的意思,把存儲的圖片資源看做是水,想要盛水必須得有桶,就是這個意思了。
以下步驟可以查看阿里云的視頻教學:
https://help.aliyun.com/learn/learningpath/oss.html?spm=5176.11888651.1190625.4.44623a4cD6hbPy
進入控制臺,https://oss.console.aliyun.com/overview
選擇Bucket后,即可看到對應的信息,如:url、消耗流量等 :
文件管理:
4、創建用戶
眾多產品,一般采用子賬號進行分配權限,防止越權攻擊
創建用戶的方式與短信接口中的方式一樣,創建完用戶之后需要設置oss權限。
務必保存好這兩個數據 因為此頁面一旦刷新,就再也查不到此用戶的的AccessKey ID和 AccessKey Secret,除法將這個用戶刪除 再重新創建用戶。
為新建用戶授權OSS全部權限
設置oss權限
阿里云OSS開發文檔
以上對于阿里云OSS基礎的準備工作已經做好了,下面實現代碼部分
第一步
導?依賴
第二步
創建存儲空間
OSS配置-在配置文件當中進行配置
//第1項配置 aliyun.endpoint = http://*************** //第2項配置 aliyun.accessKeyId = *********** //第3項配置 aliyun.accessKeySecret = *************** //第4項配置 aliyun.bucketName= *************** //第5項配置 aliyun.urlPrefix=http://***************/以上需要在代碼當中配置5項,我們來分別說下這5項代表的是什么:
第1項和第5項如下:
第2和第3項是我們新創建的個人用戶的accessKeyId和accessKeySecret
第4項就是我們創建的Bucket名稱
我們將這5項數據配置在代碼的配置文件aliyun.properties當中,通過配置類去加載這5項消息
配置類
@Configuration @PropertySource("classpath:aliyun.properties") @ConfigurationProperties(prefix = "aliyun") @Data public class AliyunConfig {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;private String urlPrefix;@Beanpublic OSSClient oSSClient() {return new OSSClient(endpoint, accessKeyId, accessKeySecret);}}控制器:
@RequestMapping("pic/upload") @Controller public class PicUploadController {@Autowiredprivate PicUploadService picUploadService;@PostMapping@ResponseBodypublic PicUploadResult upload(@RequestParam("file") MultipartFile multipartFile) {return this.picUploadService.upload(multipartFile);} }vo:
@Data public class PicUploadResult {// 文件唯一標識private String uid;// 文件名private String name;// 狀態有:uploading done error removedprivate String status;// 服務端響應內容,如:'{"status": "success"}'private String response;}service:
@Service public class PicUploadService {// 允許上傳的格式private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",".jpeg", ".gif", ".png"};@Autowiredprivate OSSClient ossClient;@Autowiredprivate AliyunConfig aliyunConfig;public PicUploadResult upload(MultipartFile uploadFile) {PicUploadResult fileUploadResult = new PicUploadResult();//圖片做校驗,對后綴名boolean isLegal = false;//對上傳的圖片后綴名做校驗for (String type : IMAGE_TYPE) {if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),type)) {isLegal = true;break;}}//不支持格式的上傳if (!isLegal) {fileUploadResult.setStatus("error");return fileUploadResult;}// 文件新路徑String fileName = uploadFile.getOriginalFilename();String filePath = getFilePath(fileName);// 上傳到阿里云try {// 目錄結構:images/2018/12/29/xxxx.jpgossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()));} catch (Exception e) {e.printStackTrace();//上傳失敗fileUploadResult.setStatus("error");return fileUploadResult;}// 上傳成功fileUploadResult.setStatus("done");fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);//一般這個生成的id我們會將保存在數據庫當中fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));return fileUploadResult;}//創建文件新的路徑private String getFilePath(String sourceFileName) {DateTime dateTime = new DateTime();//images/yyyy/MM/dd/xxxxxxx.jpgreturn "images/" + dateTime.toString("yyyy")+ "/" + dateTime.toString("MM") + "/"+ dateTime.toString("dd") + "/" + System.currentTimeMillis() +RandomUtils.nextInt(100, 9999) + "." +StringUtils.substringAfterLast(sourceFileName, ".");}}測試:
查看OSS服務器當中是否存在此圖片
總結
以上是生活随笔為你收集整理的图片存储解决方案--阿里云OSS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android简明开发教程二十一:访问I
- 下一篇: 数据库杂谈(九)——事务管理