摘要:網上已經一些運行不錯的圖床了,比如圖殼路過圖床那為什么我們還要自己搭建圖床呢一來是因為碼農總是喜歡折騰,二來是有了自己的圖床數據自己存儲更安全。下面是演示地址,可以先看一下搭建完成的效果。我們是以作為原型進行搭建。
網上已經一些運行不錯的圖床了,比如
那為什么我們還要自己搭建圖床呢?一來是因為碼農總是喜歡折騰,二來是有了自己的圖床數據自己存儲更安全。那么接下來我們就搞起來。下面是演示地址,可以先看一下搭建完成的效果。
https://xiaotuwo.github.io
點擊按鈕上傳圖片,完成以后可以復制鏈接和下載
自行去nodejs 官網下載,我們主要是為了使用 npm 工具。
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
因為我們前端使用的 vue,所以需要安裝vue-cli
cnpm install -g @vue/cli
vue create xiaotuwo
cnpm install ant-design-vue --save
cd xiaotuwo
npm run serve
http://localhost:8080
到這里我們基礎環境就搭建完成了,下面就開始編寫前端的代碼。我們是以 sm.ms 作為原型進行搭建。如下圖我們只編輯他的頭部,上傳部分和尾部
成品形態如下,把 sm.ms 拖拽上傳圖片的交互設計改成了點擊上傳圖片,不過如果你想實現拖拽也是非常簡單,下面是 antd 的樣式,換一個標簽即可。
https://www.antdv.com/components/upload-cn/
頭部和尾部代碼非常簡單,我們只講解上傳部分代碼。搭建好 vue 框架以后去上面提供的 antd 的網址里面找到 upload 控件,直接點擊復制自己喜歡的代碼樣式,粘貼到 content/index.vue
里面就可以了,然后修改 a-upload
的 action 為自己的服務器地址即可,本地測試就是http://localhost:8887/api/images/upload
,下文中也有配套的服務端代碼。
vue 的語法就不具體展開了,主要講解一個地方, handlePreview
方法里面我添加了一個復制鏈接的邏輯,可以輕松的點擊預覽的時候復制圖片鏈接,這樣方便的把網址放入其他地方進行使用。
his.$message.success(復制圖片鏈接成功);
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
本文采用的是 US3 進行圖床搭建,目前 US3 有 20G 的免費存儲和每個月 20G 的免費流量,對于自用和起步還是足夠的。
復制下面的鏈接到瀏覽器訪問查看 US3 官網,首次進入需要注冊
https://urlify.cn/YNNBNn
注冊完成以后,進入控制臺創建 US3 空間
進入空間以后填寫存儲名,私有空間和公開空間都可以,我創建的是 xiaotuwo.cn-bj.ufileos.com
留存備用。
在 US3 控制臺創建令牌,主要是用來上傳,刪除圖片使用
選擇好自己剛才創建的空間,設置年限點擊確定即可,記得一定要勾選令牌的權限
點擊完成以后獲取到公鑰私鑰,復制備用
服務端代碼主要分為三個部分
1、接收請求的 Controller
2、上傳圖片到 US3 的邏輯
3、返回內容處理
1、 編寫 Controller
使用 MultipartHttpServletRequest
接收到前端的 file 文件,調用 uCloudProvider
進行上傳。
@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;
}
2、上傳圖片到 US3 的邏輯
上傳 US3 主要是一些配置文件,我直接使用的 Maven 的 Filter 處理,配置文件在 pom.xml 里面,編譯的時候寫入 application.properties
dev
8887
你的公鑰
你的私鑰
你的bucket名字.cn-bj.ufileos.com
你的bucket名字.cn-bj.ufileos.com
鑒黃公鑰
鑒黃私鑰
鑒黃ID
http://api.uai.ucloud.cn/v1/image/scan
true
我們會發現配置文件里面除了文件的配置還有一套鑒黃的配置,對的這個地方不是本文的重點,但是圖床一定要有鑒黃的能力,具體的實現可以參考文章 怒爬某 Hub 資源就為擼了一個鑒黃平臺
具體 US3 的邏輯代碼也是非常的簡單,主要的邏輯就是上傳,使用私鑰和時間戳生成鏈接,顯示。
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);
}
}
3、 返回內容處理,這里也需要注意一下,為了配合 antd 的 upoad 控件,我們的 dto 如下
@Data
public class FileDTO {
private String name;
private String status;
private String url;
private String thumbUrl;
}
服務器端源碼訪問
https://github.com/xiaotuwo/xiaotuwo-server
到這里就全部結束了,你學會了嗎?如果有任何問題,可以到 US3 自己的官方論壇提問
https://uclub.ucloud.cn/invite/93
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125918.html
摘要:筆主很早就開始用阿里云存儲服務當做自己的圖床了。阿里云對象存儲文檔,本篇文章會介紹到整合阿里云存儲服務實現文件上傳下載以及簡單的查看。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂并且能夠在看完...
摘要:其實這個應用并不是那么的特別需求,一來本人寫越來越少,二來開發工作也是越做越少,再者目前的編輯器幾乎都支持直接剪切板上傳圖片,使圖床應用的場景越來越少。 其實這個應用并不是那么的特別需求,一來本人寫blog越來越少,二來開發工作也是越做越少,再者目前的編輯器幾乎都支持直接剪切板上傳圖片,使圖床應用的場景越來越少。不過本人本著不想丟棄技術的內心想法,以及鍛煉自己寫一個完整項目,還是開啟了...
摘要:出于自用的目的,又找不到寫的開源的程序,然后使用開源上傳組件用寫了一個圖床目前支持七牛云,阿里云使用的時候需要按照里面的注釋配置即可作者鵬磊出處版權歸作者所有,轉載請注明出處關注公眾號,搜云庫,分享技術,分享生活 Open source Picture bed 出于自用的目的,又找不到Java寫的開源的程序,然后使用開源上傳組件?bootstrap-fileinput?用?Spring...
摘要:本篇文章就來分享一下兩款開箱即用上手容易的圖床相冊程序和在線文件管理器目錄列表程序,由好友開發并維護,非常適合個人站長用作圖床相冊和文件下載分享。雖然說現在照片還有文件存儲等都可以上傳到網盤中,但是國內的網盤與國外的網盤存儲還有點不一樣。以百度網盤與Dropbox對比為例,百度網盤頂多算是一個個人用來存放私人照片和文件的網絡硬盤,如果用來分享的話很容易被百度限制或者取消下載。很多的個人站長為...
摘要:今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...
閱讀 3528·2023-04-25 20:09
閱讀 3733·2022-06-28 19:00
閱讀 3053·2022-06-28 19:00
閱讀 3071·2022-06-28 19:00
閱讀 3160·2022-06-28 19:00
閱讀 2870·2022-06-28 19:00
閱讀 3031·2022-06-28 19:00
閱讀 2628·2022-06-28 19:00