10 分鐘使用 Spring Boot + Vue + Antd + US3 搭建自己的圖床
閱讀本文大概需要 5.5 分鐘。
SM.MS https://sm.ms/ 圖殼 https://imgkr.com 路過圖床 https://imgchr.com/

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


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)行使用。his.$message.success('復(fù)制圖片鏈接成功');
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)
})
服務(wù)器端環(huán)境準(zhǔn)備

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



編寫服務(wù)端代碼
MultipartHttpServletRequest?接收到前端的 file 文件,調(diào)用?uCloudProvider進(jìn)行上傳。@PostMapping({"/api/files/upload"})
????@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;
????}
<id>devid>
<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>
public?FileDTO?upload(InputStream?fileStream,?String?mimeType,?String?fileName)?{
????????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);
????????}
????}
@Data
public?class?FileDTO?{
????private?String?name;
????private?String?status;
????private?String?url;
????private?String?thumbUrl;
}
推薦閱讀:
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?

