10 分鐘使用 Spring Boot + Vue + Antd + US3 搭建自己的圖床
??? ?
? ?正文? ?
SM.MS https://sm.ms/ 圖殼 https://imgkr.com 路過圖床 https://imgchr.com/
點(diǎn)擊按鈕上傳圖片,完成以后可以復(fù)制鏈接和下載

準(zhǔn)備前端環(huán)境
安裝 nodejs
自行去nodejs 官網(wǎng)下載,我們主要是為了使用 npm 工具。安裝淘寶鏡像,如果是在國內(nèi),下載鏡像很慢,所以使用國內(nèi)的鏡像 ? 。
安裝 vue-cli 工具
因?yàn)槲覀兦岸耸褂玫?vue,所以需要安裝vue-cli
創(chuàng)建項(xiàng)目
添加 antd 依賴
啟動
npm?run?serve??
訪問,能夠訪問 HelloWorld 頁面說明我們環(huán)境準(zhǔn)備成功了。
編寫前端代碼

https://www.antdv.com/components/upload-cn/

content/index.vue?里面就可以了,然后修改?a-upload?的 action 為自己的服務(wù)器地址即可,本地測試就是http://localhost:8887/api/images/upload,下文中也有配套的服務(wù)端代碼。
handlePreview?方法里面我添加了一個(gè)復(fù)制鏈接的邏輯,可以輕松的點(diǎn)擊預(yù)覽的時(shí)候復(fù)制圖片鏈接,這樣方便的把網(wǎng)址放入其他地方進(jìn)行使用。document.addEventListener("copy",?function?copyCall(e)?{
??e.preventDefault()
??e.clipboardData.setData("text/html",?file.preview)
??e.clipboardData.setData("text/plain",?file.preview)
??document.removeEventListener("copy",?copyCall)
})
https://github.com/xiaotuwo/xiaotuwo-client
服務(wù)器端環(huán)境準(zhǔn)備
https://urlify.cn/YNNBNn
注冊完成以后,進(jìn)入控制臺創(chuàng)建 US3 空間

xiaotuwo.cn-bj.ufileos.com?留存?zhèn)溆谩?/section>



編寫服務(wù)端代碼
1、接收請求的 Controller
2、上傳圖片到 US3 的邏輯
3、返回內(nèi)容處理
使用?
MultipartHttpServletRequest?接收到前端的 file 文件,調(diào)用?uCloudProvider進(jìn)行上傳。????@ResponseBody
????public?FileDTO?upload(HttpServletRequest?request)?{
????????FileDTO?resultFileDTO?=?new?FileDTO();
????????MultipartHttpServletRequest?multipartRequest?=?(MultipartHttpServletRequest)?request;
????????MultipartFile?file?=?multipartRequest.getFile("file");
????????long?start?=?System.currentTimeMillis();
????????try?{
????????????if?(file?==?null)?{
????????????????resultFileDTO.setStatus("error");
????????????}
????????????FileDTO?fileDTO?=?uCloudProvider.uploadWithExpired(file.getInputStream(),?file.getContentType(),?Objects.requireNonNull(file.getOriginalFilename()));
????????????log.info("UPLOAD_FILE_EXPIRED|ip:{}|referer:{}|url:{}|cost:{}",?getIpAddress(request),?request.getHeader("referer"),?fileDTO.getUrl(),?System.currentTimeMillis()?-?start);
????????????executorService.submit(new?UCloudScanner(fileDTO,?uCloudProvider,?executorService,?1));
????????????resultFileDTO.setName(fileDTO.getName());
????????????resultFileDTO.setUrl(fileDTO.getUrl());
????????????resultFileDTO.setThumbUrl(fileDTO.getUrl());
????????????resultFileDTO.setStatus("done");
????????}?catch?(Exception?e)?{
????????????log.error("UPLOAD_FILE_ERROR",?e);
????????????resultFileDTO.setStatus("error");
????????}
????????return?resultFileDTO;
????}
上傳 US3 主要是一些配置文件,我直接使用的 Maven 的 Filter 處理,配置文件在 pom.xml 里面,編譯的時(shí)候?qū)懭?application.properties
<properties>
????<server.port>8887server.port>
????<ucloud.ufile.public-key>你的公鑰ucloud.ufile.public-key>
????<ucloud.ufile.private-key>你的私鑰ucloud.ufile.private-key>
????<ucloud.ufile.upload-domain-private>你的bucket名字.cn-bj.ufileos.comucloud.ufile.upload-domain-private>
????<ucloud.ufile.download-domain-private>你的bucket名字.cn-bj.ufileos.comucloud.ufile.download-domain-private>
????<ucloud.uaicensor.publicKey>鑒黃公鑰ucloud.uaicensor.publicKey>
????<ucloud.uaicensor.privateKey>鑒黃私鑰ucloud.uaicensor.privateKey>
????<ucloud.uaicensor.resourceId>鑒黃IDucloud.uaicensor.resourceId>
????<ucloud.uaicensor.url>http://api.uai.ucloud.cn/v1/image/scanucloud.uaicensor.url>
properties>
<activation>
????<activeByDefault>trueactiveByDefault>
activation>
具體 US3 的邏輯代碼也是非常的簡單,主要的邏輯就是上傳,使用私鑰和時(shí)間戳生成鏈接,顯示。
????????String?generatedFileName;
????????String[]?filePaths?=?fileName.split("\\.");
????????if?(filePaths.length?>?1)?{
????????????generatedFileName?=?UUID.randomUUID().toString()?+?"."?+?filePaths[filePaths.length?-?1];
????????}?else?{
????????????throw?new?ErrorCodeException(ErrorCode.FILE_UPLOAD_FAIL);
????????}
????????long?start?=?System.currentTimeMillis();
????????try?{
????????????log.debug("UCloudProvider?start?upload?file,?filename?:?{},?time?:?{}",?fileName,?new?Date());
????????????ObjectAuthorization?objectAuthorization?=?new?UfileObjectLocalAuthorization(publicKey,?privateKey);
????????????ObjectConfig?config?=?new?ObjectConfig(uploadDomainPrivate);
????????????PutObjectResultBean?response?=?UfileClient.object(objectAuthorization,?config)
????????????????????.putObject(fileStream,?mimeType)
????????????????????.nameAs(generatedFileName)
????????????????????.toBucket(bucketNamePrivate)
????????????????????.setOnProgressListener((bytesWritten,?contentLength)?->?{
????????????????????})
????????????????????.execute();
????????????log.debug("UCloudProvider?end?upload?file,?filename?:?{},?time?:?{},?cost?:?{}",?fileName,?new?Date(),?System.currentTimeMillis()?-?start);
????????????if?(response?!=?null?&&?response.getRetCode()?==?0)?{
????????????????long?start2?=?System.currentTimeMillis();
????????????????log.debug("UCloudProvider?start?get?url,?filename?:?{},?time?:?{}",?fileName,?new?Date());
????????????????String?url?=?UfileClient.object(objectAuthorization,?new?ObjectConfig(downloadDomainPrivate))
????????????????????????.getDownloadUrlFromPrivateBucket(generatedFileName,?bucketNamePrivate,?24?*?60?*?60)
????????????????????????.createUrl();
????????????????log.debug("UCloudProvider?end?get?url,?filename?:?{},?time?:?{},?cost?:?{}",?fileName,?new?Date(),?System.currentTimeMillis()?-?start2);
????????????????FileDTO?fileDTO?=?new?FileDTO();
????????????????fileDTO.setUrl(url.replace("http",?"https"));
????????????????fileDTO.setName(generatedFileName);
????????????????return?fileDTO;
????????????}?else?{
????????????????log.debug("UCloudProvider?end?upload?file,?filename?:?{},?time?:?{},?cost?:?{}",?fileName,?new?Date(),?System.currentTimeMillis()?-?start);
????????????????log.error("upload?error,{}",?response);
????????????????throw?new?ErrorCodeException(ErrorCode.FILE_UPLOAD_FAIL);
????????????}
????????}?catch?(UfileClientException?|?UfileServerException?e)?{
????????????log.debug("UCloudProvider?end?upload?file,?filename?:?{},?time?:?{},?cost?:?{}",?fileName,?new?Date(),?System.currentTimeMillis()?-?start);
????????????log.error("upload?error,{}",?fileName,?e);
????????????throw?new?ErrorCodeException(ErrorCode.FILE_UPLOAD_FAIL);
????????}
????}
public?class?FileDTO?{
????private?String?name;
????private?String?status;
????private?String?url;
????private?String?thumbUrl;
}
服務(wù)器端源碼訪問
https://github.com/xiaotuwo/xiaotuwo-server
到這里就全部結(jié)束了,你學(xué)會了嗎?如果有任何問題,可以到 US3 自己的官方論壇提問?
https://uclub.ucloud.cn/invite/93
逆鋒起筆是一個(gè)專注于程序員圈子的技術(shù)平臺,你可以收獲最新技術(shù)動態(tài)、最新內(nèi)測資格、BAT等大廠的經(jīng)驗(yàn)、精品學(xué)習(xí)資料、職業(yè)路線、副業(yè)思維,微信搜索逆鋒起筆關(guān)注!
評論
圖片
表情
