Java 干貨公眾號粉絲福利,技術 leader 教你如何將圖片保存到 OSS
新入職實習生小二,帶著熱忱與迷茫踏入職場,開啟了技術實習之旅。我受命向他傳授一項看似簡單的任務——將前端編輯器上傳的圖片存儲至服務器。出乎意料的是,他徑直將圖片存儲于服務器。此舉令我不禁懊惱,亦引發深思:在當前技術環境下,是否仍有同行直接存儲圖像于服務器?正確做法應是選用OSS或MinIO等對象存儲服務。
小二的初體驗:直接保存圖片到服務器
初級階段,操作員直接將客戶端提交的圖像存入服務器。盡管此方法簡便,卻顯露出其對存儲技術的理解局限。在網絡架構現狀下,將圖像直接存入服務器,不僅效率欠佳且管理繁重。服務器應專注于執行業務邏輯,而非海量靜態內容的存儲。此情況表明,該操作員迫切需要更多專業指導和知識積累。
導師的無奈與指導:從服務器到OSS
在審閱小二作業時,我感到憤怒與沮喪。作業未能達到現代技術標準,引發了我的不滿;考慮到他是新入行者,學習曲線漫長,我感到無力。因此,我決定親自指導,逐步講解從圖片到對象存儲服務(OSS)的存儲步驟。OSS是阿里云提供的高效、安全存儲方案。通過采用OSS,我們能在云端有效保存靜態資源,既提高了存儲效率,又極大地簡化了管理流程。
小二的轉變:從懵懂到自信
在本指導下,小二逐步在SpringBoot應用中集成OSS服務。通過阿里云官網,他以“OSS”為關鍵詞搜索相關信息。隨后,創建了新的OSS存儲容器,并配置了公開讀權限,以便互聯網用戶瀏覽內部圖片。盡管初期操作略顯新手,但小二展現出強烈的學習意愿和良好的適應性。
????com.aliyun.oss
????aliyun-sdk-oss
????3.10.2
OSS的整合:從配置到上傳
aliyun:
??oss:
??????#?oss對外服務的訪問域名
????endpoint:?oss-cn-beijing.aliyuncs.com
??????#?訪問身份驗證中用到用戶標識
????accessKeyId:?LTAI5
??????#?用戶用于加密簽名字符串和oss用來驗證簽名字符串的密鑰
????accessKeySecret:?RYN
??????#?oss的存儲空間
????bucketName:?itwanger-oss1
??????#?上傳文件大小(M)
????maxSize:?3
??????#?上傳文件夾路徑前綴
????dir:
??????prefix:?codingmore/images/
在部署集成對象存儲服務(OSS)流程之際,工程師首步運用Java配置類引入@Value注解,以此從配置文件中提取OSS配置數據。隨后,工程師編寫服務層代碼,確保了文件向OSS的上傳功能及其存儲路徑的提供。盡管過程復雜,工程師仍高效操作,順利將圖片上傳至OSS平臺。
@Configuration
public?class?OssClientConfig?{
????@Value("${aliyun.oss.endpoint}")
????String?endpoint?;
????@Value("${aliyun.oss.accessKeyId}")
????String?accessKeyId?;
????@Value("${aliyun.oss.accessKeySecret}")
????String?accessKeySecret;
????@Bean
????public?OSSClient?createOssClient()?{
????????return?(OSSClient)new?OSSClientBuilder().build(endpoint,?accessKeyId,?accessKeySecret);
????}
}
測試與驗證:從上傳到確認
@Controller
@Api(tags?=?"上傳")
@RequestMapping("/ossController")
public?class?OssController?{
????@Autowired
????private?IOssService?ossService;
????@RequestMapping(value?=?"/upload",method=RequestMethod.POST)
????@ResponseBody
????@ApiOperation("上傳")
????public?ResultObject?upload(@RequestParam("file")?MultipartFile?file,?HttpServletRequest?req)??{
????????return?ResultObject.success(ossService.upload(file));
????}
}
完成OSS集成任務后,小二采用Postman對上傳接口進行了細致檢驗,驗證圖片上傳無誤并獲取了正確鏈接。隨后,團隊訪問阿里云OSS控制臺核實圖片成功上傳。這些檢驗步驟提升了小二的操作自信,同時展現了其技能的提升。
前端測試:從上傳到顯示
@Service
public?class?OssServiceImpl?implements?IOssService{
????@Value("${aliyun.oss.maxSize}")
????private?int?maxSize;
???
????@Value("${aliyun.oss.bucketName}")
????private?String?bucketName;
??
????@Value("${aliyun.oss.dir.prefix}")
????private?String?dirPrefix;
????
????@Autowired
????private?OSSClient?ossClient;???
????@Override
????public?String?upload(MultipartFile?file)?{
????????try?{
????????????return?upload(file.getInputStream(),?file.getOriginalFilename());
????????}?catch?(IOException?e)?{
????????????LOGGER.error(e.getMessage());
????????}
????????return?null;
????}
????@Override
????public?String?upload(InputStream?inputStream,String?name)?{
????????String?objectName?=?getBucketName(name);
????????//?創建PutObject請求。
????????ossClient.putObject(bucketName,?objectName,?inputStream);
????????return?formatPath(objectName);
????}
????private?String?getBucketName(String?url){
????????String?ext?=?"";
????????for(String?extItem:imageExtension){
????????????if(url.indexOf(extItem)?!=?-1){
????????????????ext?=?extItem;
????????????????break;
????????????}
????????}
????????return?dirPrefix+?DateUtil.today()+"/"+?IdUtil.randomUUID()+ext;
????}
????private?String?formatPath(String?objectName){
????????return?"https://"??+bucketName+"."+?ossClient.getEndpoint().getHost()?+?"/"?+?objectName;
????}
}??
為了全面評估開放源代碼系統(OSS)的集成效益,小二順利下載并激活了前端腳本及Web管理界面。在內容編輯過程中,他選擇并上傳了圖片,驗證了圖片從前端至服務器的順暢傳輸,經服務器處理后再上傳至OSS,最終生成了可供前端訪問的圖片鏈接。此過程的順利進行提升了小二對操作方法的信心。
外鏈轉鏈:從外鏈到OSS
對OSS系統綜合集成完畢后,小二對外部鏈接轉換功能進行了詳盡測試。他在Java類中拓展了圖片轉換至外部鏈接的功能,通過正則表達式識別文檔鏈接,并保存在OSS。隨后,他將圖片替換至原鏈接。Web管理端驗證確認,該轉換過程流暢,圖片顯示正常。
總結與展望:從實習到成長
在本次OSS集成項目中,小二不僅熟練掌握了將圖像上傳至OSS的操作,且精通了相關技術流程。面對挑戰,其顯著進步不言而喻。盡管OSS與CDN是理想的圖床組合,阿里云HTTPSCDN在個別情況下存在回源故障,影響圖片展示,這一缺陷亟待改進。然而,此次實踐活動對小二的技術發展至關重要。
作者:小藍
鏈接:http://m.huanchou.cn/content/2710.html
本站部分內容和圖片來源網絡,不代表本站觀點,如有侵權,可聯系我方刪除。