灏忎簩鏄柊鏉ョ殑瀹炰範鐢熴€備綔涓烘妧鏈痩eader锛屾垜缁欎粬瀹夋帓浜嗕竴涓緢绠€鍗曠殑鍔ㄦ墜缁冧範浠诲姟锛屽皢鍓嶇markdown缂栬緫鍣ㄤ笂浼犵殑鍥剧墖淇濆瓨鍒版湇鍔″櫒绔紝缁撴灉浠栫湡鐨勬妸鍥剧墖鐩存帴淇濆瓨鍦ㄤ簡鏈嶅姟鍣ㄤ笂锛岀湡鏄皵姝讳簡meoff锛屼负浠€涔堟垜涓嶈兘鍒涘缓涓€涓璞″瓨鍌ㄦ湇鍔★紝姣斿OSS锛孧inIO锛熶粬鐞嗙洿姘斿.鐨勫弽椹抽亾锛氣€滆皝璁╀綘涓嶈В閲婃竻妤氱殑锛屾垜鍘绘壘鑰佹澘寮€闄や綘锛佲€濇垜绔嬮┈琚鏈嶈锛氣€滄潵锛屾垜鏁欎綘鎬庝箞瀛樺浘鐗囧埌OSS濂戒笉濂斤紵濂戒笉濂斤紵鈥濃€滀笉鐢紝鎴戞暀浣犮€傗€濆皬浜屽緢鏈変俊蹇冿紝涓嬮潰鏄粬鍦⊿pringBoot搴旂敤涓泦鎴怬SS鐨勮褰曘€傜壒姝ゅ0鏄庯細闃块噷浜慜SS浜у搧璐熻矗浜猴紝鐪嬪埌鍚庤鑷杩囨潵缁撶畻鎺ㄥ箍璐癸紙鐙楀ご锛夈€傝瀹炶瘽锛歋pringBoot+OSS鍦ㄥ疄闄呭紑鍙戜腑杩樻槸姣旇緝甯歌鐨勩€?銆佹縺娲籓SSOSS锛屼篃灏辨槸瀵硅薄瀛樺偍鏈嶅姟锛屾槸闃块噷浜戞彁渚涚殑涓€濂楀璞″瓨鍌ㄦ湇鍔°€傚浗鍐呯珵鍝佹湁涓冪墰浜戠殑Kodo鍜岃吘璁簯鐨凜OS銆傜涓€姝ョ櫥褰曢樋閲屼簯瀹樼綉锛屾悳绱㈠叧閿瓧鈥淥SS鈥濓紝杩涘叆OSS浜у搧椤甸潰銆傜浜屾锛屽鏋滀綘鏄疧SS鐨勬柊鐢ㄦ埛锛屽彲浠ヤ韩鍙?涓湀鐨勬柊浜轰紭鎯犱环锛屼絾鏄画璐硅繕鏄細鐥涖€傜涓夋锛岃繘鍏SS绠$悊鎺у埗鍙帮紝鐐瑰嚮鈥淏ucketList鈥濓紝鐐瑰嚮鈥淐reateBucket鈥濄€侭ucket鐨勫瓧闈㈡剰鎬濇槸妗讹紝鎸囩殑鏄瓨鍌ㄧ┖闂达紝鏄瓨鍌ㄥ璞$殑瀹瑰櫒銆傛敞鎰忚鍐欐潈闄愪负鈥滃叕鍏辫鍙栤€濓紝鍗冲厑璁镐簰鑱旂綉鐢ㄦ埛璁块棶浜戠┖闂翠腑鐨勫浘鐗囥€傜鍥涙锛氱偣鍑烩€滅‘瀹氣€濆畬鎴愭縺娲汇€?.闆嗘垚OSS绗竴姝ユ槸鍦╬om.xml鏂囦欢涓坊鍔燨SS渚濊禆銆?!--闃块噷浜慜SS-->com.aliyun.ossaliyun-sdk-oss3.10.2绗簩姝ワ紝鍦╝pplication.yml鏂囦欢涓坊鍔燨SS閰嶇疆椤广€俛liyun:oss:#oss瀵瑰鏈嶅姟鐨勮闂煙鍚嶇鐐癸細oss-cn-beijing.aliyuncs.com#璁块棶閴存潈鏃朵娇鐢ㄧ殑鐢ㄦ埛IDaccessKeyId:LTAI5#鐢ㄦ埛鐢ㄤ簬鍔犲瘑绛惧悕涓诧紝oss鏄敤浜庨獙璇佺鍚嶅瓧绗︿覆accessKeySecret:RYN#oss瀛樺偍绌洪棿bucketName:itwanger-oss1#涓婁紶鏂囦欢澶у皬(M)maxSize:3#涓婁紶鏂囦欢澶硅矾寰刾refixdir:prefix:codingmore/images/绗笁姝ワ紝娣诲姞OssClientConfig.java閰嶇疆绫伙紝涓昏鏄€氳繃@Value娉ㄨВ浠庨厤缃枃浠朵腑鑾峰彇閰嶇疆椤癸紝鐒跺悗鍒涘缓OSSClient銆侤ConfigurationpublicclassOssClientConfig{@Value("${aliyun.oss.endpoint}")Stringendpoint;@Value("${aliyun.oss.accessKeyId}")StringaccessKeyId;@Value("${aliyun.oss.accessKeySecret}")StringaccessKeySecret;@BeanpublicOSSClientcreateOssClient(){return(OSSClient)newOSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);}}绗洓姝ワ紝娣诲姞鏂囦欢涓婁紶鎺ュ彛OssController.java锛屽弬鏁颁负MultipartFile銆侤Controller@Api(tags="Upload")@RequestMapping("/ossController")publicclassOssController{@AutowiredprivateIOssServiceossService;@RequestMapping(value="/upload",method=RequestMethod.POST)@ResponseBody@ApiOperation("Upload")publicResultObjectupload(@RequestParam("file")MultipartFilefile,HttpServletRequestreq){returnResultObject.success(ossService.upload(鏂囦欢));涓婁紶鍒癘SS骞惰繑鍥炴枃浠朵繚瀛樿矾寰勩€侤ServicepublicclassOssServiceImplimplementsIOssService{@Value("${aliyun.oss.maxSize}")privateintmaxSize;@Value("${aliyun.oss.bucketName}")privateStringbucketName;@Value("${aliyun.oss.dir.prefix}")privateStringdirPrefix;@AutowiredprivateOSSClientossClient;@OverridepublicStringupload(MultipartFilefile){try{returnupload(file.getInputStream(),file.getOriginalFilename());}catch(IOExceptione){LOGGER.error(e.getMessage());}杩斿洖绌哄€硷紱}@OverridepublicStringupload(InputStreaminputStream,Stringname){StringobjectName=getBucketName(name);//鍒涘缓PutObject璇锋眰銆俹ssClient.putObject(bucketName,objectName,inputStream);杩斿洖鏍煎紡璺緞锛堝璞″悕绉帮級锛泒privateStringgetBucketName(Stringurl){Stringext="";for(StringextItem:imageExtension){if(url.indexOf(extItem)!=-1){ext=extItem;浼戞伅;}}returndirPrefix+DateUtil.today()+"/"+IdUtil.randomUUID()+ext;}privateStringformatPath(StringobjectName){return"https://"+bucketName+"."+ossClient.getEndpoint().getHost()+"/"+objectName;}}绗叚姝ワ紝鎵撳紑Apipost锛屾祴璇昈SS涓婁紶鎺ュ彛锛屾敞鎰忓弬鏁伴€夋嫨鏂囦欢锛岀偣鍑诲彂閫佸彲浠ョ湅鍒版湇鍔″櫒杩斿洖鐨勫浘鐗囬摼鎺ャ€傜涓冩锛岃繘鍏ラ樋閲屼簯OSS鍚庡彴绠$悊锛岀‘璁ゅ浘鐗囩‘瀹炰笂浼犳垚鍔熴€?銆佹媺鍙栧墠绔唬鐮佹祴璇昈SS涓婁紶鎺ュ彛codingmore-admin-web鏄疌odingmore鐨勫墠绔鐞嗛」鐩紝鍙互閫氳繃浠ヤ笅鍦板潃鎷夊彇鍒版湰鍦般€俬ttps://github.com/itwanger/c...鎵цyarnrundev鍛戒护鍚庯紝鍙互鍚姩web绠$悊缁堢锛岃繘鍏ユ枃绔犵紪杈戦〉闈紝閫夋嫨涓€寮犲浘鐗囦笂浼狅紝纭鍥剧墖鍙互涓婁紶浠庡墠绔甯稿埌鏈嶅姟鍣紝鏈嶅姟鍣ㄤ笂浼犲埌OSS锛岀劧鍚庤繑鍥炲埌鍓嶇鍥剧墖璁块棶閾炬帴銆?銆佷娇鐢∣SS鑷姩杞摼鎺ョ涓€姝ュ湪PostsServiceImpl.java涓坊鍔犺浆鍥剧墖鐨勬柟娉曪紝涓昏鏄埄鐢ㄦ鍒欒〃杈惧紡鎵惧嚭鏂囩珷鍐呭涓殑澶栭摼锛岀劧鍚庝笂浼犲閾剧殑鍥剧墖鍒癘SS锛岀劧鍚庢浛鎹㈠師鏉ョ殑澶栭摼鍥剧墖銆?/鍖归厤鍥剧墖鐨凪arkdown璇硶////publicstaticfinalStringIMG_PATTERN="\\!\\[.*\\]\\((.*)\\)";privatevoidhandleContentImg(Postsposts){Stringcontent=posts.getPostContent();妯″紡p=Pattern.compile(IMG_PATTERN,Pattern.CASE_INSENSITIVE);鍖归厤鍣╩=p.matcher(content);Map>map=newHashMap<>();while(m.find()){StringimageTag=m.group();LOGGER.info("浣跨敤鍒嗙粍鏇挎崲{}",imageTag);StringimageUrl=imageTag.substring(imageTag.indexOf("(")+1,imageTag.indexOf(")"));//纭鏄湰绔欓摼鎺ワ紝涓嶅鐞唅f(imageUrl.indexOf(iOssService.getEndPoint())!=-1){continue;}//閫氳繃绾跨▼姹犱笂浼犲浘鐗囧埌OSSFuturefuture=ossUploadImageExecutor.submit(()->{returniOssService.upload(imageUrl);});鍦板浘銆傛斁锛坕mageUrl锛屾湭鏉ワ級锛泒瀵逛簬锛堝瓧绗︿覆oldUrl:map.keySet()){Futurefuture=map.get(oldUrl);灏濊瘯{StringimageUrl=future.get();content=content.replace(oldUrl,imageUrl);}catch(InterruptedException|ExecutionExceptione){LOGGER.error("鑾峰彇鍥惧儚閾炬帴鏃跺嚭閿檣}",e.getMessage());}}posts.setPostContent(content);}绗簩姝ュ湪OssServiceImpl.java涓坊鍔犳牴鎹閾惧湴鍧€涓婁紶鍥剧墖鍒癘SS鏂规硶publicStringupload(Stringurl){StringobjectName=getFileName(url);try(InputStreaminputStream=newURL(url).openStream()){ossClient.putObject(bucketName,objectName,inputStream);}catch(IOExceptione){LOGGER.error(e.getMessage());}returnformatOSSPath(objectName);}绗笁姝ラ€氳繃web绠$悊绔祴璇曞閾炬槸鍚︿紶杈撴垚鍔熴€傚厛鎵句袱寮犲閾剧殑鍥剧墖锛屽彲浠ョ湅鍒伴瑙堢殑鏃跺€欐病鏈夋樉绀簃arkdown銆傜劧鍚庢垜浠偣鍑诲彂甯冿紝鍙互鐪嬪埌涓ゅ紶鍥剧墖鏄剧ず姝e父锛屽洜涓哄凡缁忚浆鎹负OSS鐨勫浘鐗囪闂湴鍧€銆備簲銆佹€荤粨缁间笂鎵€杩帮紝灏忎簩瀹炰範鐢熷湪SpringBoot涓泦鎴怬SS浠g爜杩樻槸姣旇緝闈犺氨鐨勩€傛垨璁窸SS+CDN鏄浘搴婃渶濂界殑瑙e喅鏂规锛屼絾鏄敱浜庨樋閲屼簯鐨凥TTPSCDN鏃犳硶鍦℅itHub涓婂洖婧愬鑷村浘鐗囨棤娉曞睍绀虹殑闂涓€鐩存病鏈夊緱鍒版湁鏁堣В鍐炽€傞渶瑕佹簮鐮佺殑鏈嬪弸鍙互鐩存帴杩涘叆缂栫▼鍠电殑婧愮爜璺緞锛歨ttps://github.com/itwanger/coding-more鏈枃宸叉敹褰曞湪GitHub涓?.8k+star鐨勫紑婧愪笓鏍忋€奐ava 绋嬪簭鍛樿繘闃朵箣璺€?涓€涓ソ鐨凧ava绋嬪簭鍛樺枩娆㈠ス锛屽菇榛橀瓒o紝閫氫織鏄撴噦銆傚唴瀹瑰寘鎷琂ava鍩虹銆丣ava骞跺彂缂栫▼銆丣ava铏氭嫙鏈恒€丣ava浼佷笟绾у紑鍙戙€丣ava闈㈣瘯绛夋牳蹇冪煡璇嗙偣銆傚涔燡ava锛屽彧涓哄鎵綣ava绋嬪簭鍛樼殑杩涢樁涔嬭矾馃槃銆俬ttps://github.com/itwanger/toBeBetterJavaerstar杩欎釜瀛樺偍搴撴剰鍛崇潃浣犳湁娼滃姏鎴愪负涓€鍚嶄紭绉€鐨凧ava宸ョ▼甯堛€備篃鍙互鐐瑰嚮涓嬫柟閾炬帴璺宠浆鍒般€奐ava 绋嬪簭鍛樿繘闃朵箣璺€嬪畼缃戯紝寮€鍚剦蹇殑瀛︿範涔嬫梾銆俬ttps://tobebetterjavaer.com/娌℃湁浠€涔堣兘闃绘鎴戔€斺€旈櫎浜嗙洰鐨勶紝鍗充娇宀歌竟鏈夌帿鐟般€佺豢鑽拰瀹侀潤鐨勬腐婀撅紝鎴戜篃涓嶅彈鏉熺細銆?/p>