Spring boot集成Go-FastDFS實(shí)現(xiàn)圖片上傳刪除等功能實(shí)現(xiàn)
一.背景
工作中接觸到需要采集并管理大量圖片的需求,本來(lái)是用的FastDFS,但是發(fā)現(xiàn)實(shí)際情況是在項(xiàng)目實(shí)施時(shí)難以找到linux服務(wù)器去安裝FastDFS,所以經(jīng)過(guò)調(diào)研,選擇了可以在windows服務(wù)器上安裝部署的Go-FastDFS文件服務(wù)器
二.Go-FastDFS簡(jiǎn)介
go-fastdfs是一個(gè)基于http協(xié)議的分布式文件系統(tǒng),它基于大道至簡(jiǎn)的設(shè)計(jì)理念,一切從簡(jiǎn)設(shè)計(jì),使得它的運(yùn)維及擴(kuò)展變得更加簡(jiǎn)單,它具有高性能、高可靠、無(wú)中心、免維護(hù)等優(yōu)點(diǎn)。
三.安裝Go-FastDFS文件服務(wù)器
1)下載地址:https://github.com/sjqzhang/go-fastdfs/releases
2)下載完成直接啟動(dòng)fileserver.exe
3)驗(yàn)證是否安裝成功,訪問(wèn)localhost:8080
4)驗(yàn)證上傳功能,點(diǎn)擊選擇文件選擇好文件后,點(diǎn)擊上傳
5)在返回的url后加?download=0,查看圖片
四.實(shí)例實(shí)現(xiàn)功能
1)圖片上傳
2)圖片刪除
3)圖片訪問(wèn)
4)圖片水印添加
五.創(chuàng)建Spring boot項(xiàng)目,寫(xiě)代碼實(shí)現(xiàn)功能
1)pom.xml添加依賴
<!--工具包--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency>
2)核心代碼,使用go-fastdhs上傳圖片并添加水印及刪除圖片工具類
@Component public class GoFastdfsClientUtil { @Value("${camera.upload.path}") private String uploadPath; @Value("${camera.delete.path}") private String deletePath; private final Logger logger = LoggerFactory.getLogger(GoFastdfsClientUtil.class); /** * 圖片上傳 * * @param file * @param sixCode * @return * @throws IOException */ public UploadResult upload(MultipartFile file, String sixCode) throws IOException { UploadResult uploadResult = new UploadResult(); ByteArrayOutputStream bos = addWatermark(file, sixCode); byte[] b = bos.toByteArray(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(b); InputStreamResource isr = new InputStreamResource(byteArrayInputStream, file.getOriginalFilename()); Map<String, Object> params = new HashMap<>(); params.put("file", isr); params.put("path", "image"); params.put("output", "json"); // 場(chǎng)景 params.put("scene", "image"); String resp = HttpUtil.post(uploadPath, params); Console.log("resp: {}", resp); JSONObject exJson = JSONObject.parseObject(resp); uploadResult = JSON.toJavaObject(exJson, UploadResult.class); return uploadResult; } /** * 圖片刪除 * * @param fileUrl */ public void deleteImage(String md5) { if (StringUtils.isEmpty(md5)) { return; } try { Map<String, Object> params = new HashMap<>(); params.put("md5", md5); HttpUtil.post(deletePath, params); } catch (Exception e) { logger.warn(e.getMessage()); } } /** * 加水印 * * @param myfile * @param sixCode * @return * @throws IOException */ private ByteArrayOutputStream addWatermark(MultipartFile myfile, String sixCode) throws IOException { InputStream in = myfile.getInputStream(); BufferedInputStream bis = new BufferedInputStream(in); BufferedImage image = ImageIO.read(bis); int height = image.getHeight(); int width = image.getWidth(); // 加水印 Graphics2D g = image.createGraphics(); g.drawImage(image, 0, 0, width, height, null); g.setColor(new Color(128, 128, 128)); // 字體 int num = 0; if (width > height) { num = height / 30; } else { num = width / 30; } g.setFont(new Font("微軟雅黑", Font.PLAIN, num)); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = formatter.format(new Date()); String watermarkContent = "拍攝時(shí)間:" + date + "&攝像頭編碼:" + sixCode; // 設(shè)置水印坐標(biāo) String[] split = watermarkContent.split("&"); int x = 10; int y = height - 10; for (int i = 0; i < split.length; i++) { g.drawString(split[i], x, y -= g.getFontMetrics().getHeight()); } g.dispose(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(image, "jpg", bos); return bos; } }
解釋:這里我們事先在配置文件中配置好了文件的上傳路徑以及刪除路徑,配置如下:
camera: upload: path: http://localhost:8080/group1/upload delete: path: http://localhost:8080/group1/delete visit: path: http://localhost:8080
3)上面的方法中我們將圖片上傳后的返回值轉(zhuǎn)換為結(jié)果集對(duì)象,對(duì)象定義如下:
public class UploadResult implements Serializable{ /** * */ private static final long serialVersionUID = 5534287808864118463L; private String url; private String md5; private String path; private String domain; private String scene; private BigInteger size; private BigInteger mtime; private String scenes; private String retmsg; private int retcode; private String src; ......get,set方法..... }
4)在實(shí)際應(yīng)用中編寫(xiě)控制層方法調(diào)用核心工具類的上傳,刪除方法即可
總結(jié):本次總結(jié)主要描述了spring boot集成go-fastdfs上傳圖片的核心方法,沒(méi)有具體的測(cè)試展示,其實(shí)go-fastdfs的使用很簡(jiǎn)單,接口編寫(xiě)也很簡(jiǎn)單
到此這篇關(guān)于Spring boot集成Go-FastDFS實(shí)現(xiàn)圖片上傳刪除等功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring boot集成Go-FastDFS圖片上傳刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java面試突擊之sleep和wait有什么區(qū)別詳析
按理來(lái)說(shuō)sleep和wait本身就是八竿子打不著的兩個(gè)東西,但是在實(shí)際使用中大家都喜歡拿他們來(lái)做比較,或許是因?yàn)樗鼈兌伎梢宰尵€程處于阻塞狀態(tài),這篇文章主要給大家介紹了關(guān)于java面試突擊之sleep和wait有什么區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-02-02Springboot如何根據(jù)實(shí)體類生成數(shù)據(jù)庫(kù)表
這篇文章主要介紹了Springboot如何根據(jù)實(shí)體類生成數(shù)據(jù)庫(kù)表的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09IntelliJ?IDEA?2023.2最新版激活方法及驗(yàn)證ja-netfilter配置是否成功
隨著2023.2版本的發(fā)布,用戶們渴望了解如何激活這個(gè)最新版的IDE,本文將介紹三種可行的激活方案,包括許可證服務(wù)器、許可證代碼和idea?vmoptions配置,幫助讀者成功激活并充分利用IDEA的功能,感興趣的朋友參考下吧2023-08-08淺談Java 三種方式實(shí)現(xiàn)接口校驗(yàn)
這篇文章主要介紹了淺談Java 三種方式實(shí)現(xiàn)接口校驗(yàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Java 中Json中既有對(duì)象又有數(shù)組的參數(shù)如何轉(zhuǎn)化成對(duì)象(推薦)
Gson庫(kù)是一個(gè)功能強(qiáng)大、易于使用的Java序列化/反序列化庫(kù),它提供了豐富的API來(lái)支持Java對(duì)象和JSON之間的轉(zhuǎn)換,這篇文章主要介紹了Java 中Json中既有對(duì)象又有數(shù)組的參數(shù)如何轉(zhuǎn)化成對(duì)象,需要的朋友可以參考下2024-07-07基于Process#waitFor()阻塞問(wèn)題的解決
這篇文章主要介紹了Process#waitFor()阻塞問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12編譯大型Java項(xiàng)目class沖突導(dǎo)致報(bào)錯(cuò)的解決方案
這篇文章給大家盤(pán)點(diǎn)編譯大型項(xiàng)目class沖突導(dǎo)致報(bào)錯(cuò)的解決方案,文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-10-10Java如何實(shí)現(xiàn)簡(jiǎn)單后臺(tái)訪問(wèn)并獲取IP
這篇文章主要介紹了Java如何實(shí)現(xiàn)簡(jiǎn)單后臺(tái)訪問(wèn)并獲取IP,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10使用SpringBoot 工廠模式自動(dòng)注入到Map
這篇文章主要介紹了使用SpringBoot 工廠模式自動(dòng)注入到Map,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09