最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實(shí)現(xiàn)文件在線預(yù)覽功能的全過程

 更新時(shí)間:2021年11月11日 17:05:17   作者:code2roc  
我們開發(fā)業(yè)務(wù)系統(tǒng)的時(shí)候,經(jīng)常有那種文檔文件在線預(yù)覽的需求,下面這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)文件在線預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下

背景

最近公司內(nèi)部oa系統(tǒng)升級(jí),需要增加文件在線預(yù)覽服務(wù),最常見的文件就是office文檔,一開始構(gòu)思幾個(gè)方案,比如office軟件自帶的文件轉(zhuǎn)換,openoffice轉(zhuǎn)換,offce365服務(wù),aspose組件轉(zhuǎn)換,最終采用了aspose轉(zhuǎn)換,原因是組件功能完善,不依賴其它軟件安裝環(huán)境

系統(tǒng)設(shè)計(jì)

文件類型及方案

文件類型 預(yù)覽方案
word aspsoe-word轉(zhuǎn)換圖片預(yù)覽(版本21.1)
ppt aspose-slides轉(zhuǎn)化你圖片預(yù)覽(版本20.4)
excel aspose-cell轉(zhuǎn)換html預(yù)覽(版本20.4)
pdf pdfbox緩緩圖片預(yù)覽(版本2.0.15)
png,jpg,gif 整合viewer.js預(yù)覽(版本1.5.0)
mp4 整合vedio.js預(yù)覽(js版本7.10.2)
txt 讀取文件內(nèi)容預(yù)覽

注:aspose因版權(quán)問題,工程示例代碼中全部使用試用版,轉(zhuǎn)換圖片會(huì)出現(xiàn)水印

流程設(shè)計(jì)

系統(tǒng)實(shí)現(xiàn)

識(shí)別文件后綴

URL指向文件真實(shí)路徑時(shí)根據(jù)后綴名判斷

    public static String getTypeByExtenssion(String linkUrl) {
        if (linkUrl == null)
            return null;
        linkUrl = linkUrl.toLowerCase();
        for (String ext : extensions) {
            if (linkUrl.endsWith(ext)) {
                return ext;
            }
        }
        return null;
    }

URL為文件輸出流時(shí)

根據(jù)文件輸出流的disposition

    private static String getTypeByDisposition(String disposition) {
        String ext = null;
        if (!StringUtils.isEmpty(disposition)) {
            disposition = StringUtils.replace(disposition, "\"", "");
            String[] strs = disposition.split(";");
            for (String string : strs) {
                if (string.toLowerCase().indexOf("filename=") >= 0) {
                    ext = StringUtils.substring(string, string.lastIndexOf("."));
                    break;
                }
            }
        }
        return ext;
    }

根據(jù)文件輸出流content-type

        types = new HashMap<String, String>();
        types.put("application/pdf", ".pdf");
        types.put("application/msword", ".doc");
        types.put("text/plain", ".txt");
        types.put("application/javascript", ".js");
        types.put("application/x-xls", ".xls");
        types.put("application/-excel", ".xls");
        types.put("text/html", ".html");
        types.put("application/x-rtf", ".rtf");
        types.put("application/x-ppt", ".ppt");
        types.put("image/jpeg", ".jpg");
        types.put("application/vnd.openxmlformats-officedocument.wordprocessingml.template", ".docx");
        types.put("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsx");
        types.put("application/vnd.openxmlformats-officedocument.presentationml.presentation", ".pptx");
        types.put("message/rfc822", ".eml");
        types.put("application/xml", ".xml");

根據(jù)stream的固定字節(jié)判斷

        FILE_TYPE_MAP.put(".pdf", "255044462D312E"); // Adobe Acrobat (pdf)
        FILE_TYPE_MAP.put(".doc", "D0CF11E0"); // MS Word
        FILE_TYPE_MAP.put(".xls", "D0CF11E0"); // MS Excel 注意:word 和 excel的文件頭一樣
        FILE_TYPE_MAP.put(".jpg", "FFD8FF"); // JPEG (jpg)
        FILE_TYPE_MAP.put(".png", "89504E47"); // PNG (png)
        FILE_TYPE_MAP.put(".gif", "47494638"); // GIF (gif)
        FILE_TYPE_MAP.put(".tif", "49492A00"); // TIFF (tif)
        FILE_TYPE_MAP.put(".bmp", "424D"); // Windows Bitmap (bmp)
        FILE_TYPE_MAP.put(".dwg", "41433130"); // CAD (dwg)
        FILE_TYPE_MAP.put(".html", "68746D6C3E"); // HTML (html)
        FILE_TYPE_MAP.put(".rtf", "7B5C727466"); // Rich Text Format (rtf)
        FILE_TYPE_MAP.put(".xml", "3C3F786D6C");
        FILE_TYPE_MAP.put(".zip", "504B0304"); // docx的文件頭與zip的一樣
        FILE_TYPE_MAP.put(".rar", "52617221");
        FILE_TYPE_MAP.put(".psd", "38425053"); // Photoshop (psd)
        FILE_TYPE_MAP.put(".eml", "44656C69766572792D646174653A"); // Email
        FILE_TYPE_MAP.put(".dbx", "CFAD12FEC5FD746F"); // Outlook Express (dbx)
        FILE_TYPE_MAP.put(".pst", "2142444E"); // Outlook (pst)
        FILE_TYPE_MAP.put(".mdb", "5374616E64617264204A"); // MS Access (mdb)
        FILE_TYPE_MAP.put(".wpd", "FF575043"); // WordPerfect (wpd)
        FILE_TYPE_MAP.put(".eps", "252150532D41646F6265");
        FILE_TYPE_MAP.put(".ps", "252150532D41646F6265");
        FILE_TYPE_MAP.put(".qdf", "AC9EBD8F"); // Quicken (qdf)
        FILE_TYPE_MAP.put(".pwl", "E3828596"); // Windows Password (pwl)
        FILE_TYPE_MAP.put(".wav", "57415645"); // Wave (wav)
        FILE_TYPE_MAP.put(".avi", "41564920");
        FILE_TYPE_MAP.put(".ram", "2E7261FD"); // Real Audio (ram)
        FILE_TYPE_MAP.put(".rm", "2E524D46"); // Real Media (rm)
        FILE_TYPE_MAP.put(".mpg", "000001BA"); //
        FILE_TYPE_MAP.put(".mov", "6D6F6F76"); // Quicktime (mov)
        FILE_TYPE_MAP.put(".asf", "3026B2758E66CF11"); // Windows Media (asf)
        FILE_TYPE_MAP.put(".mid", "4D546864"); // MIDI (mid)

文件解析

word分頁轉(zhuǎn)換圖片

Document doc = new Document(fileConvertInfo.getFilePath());
for (int i = 0; i < doc.getPageCount(); i++) {
    Document extractedPage = doc.extractPages(i, 1);
    extractedPage.save(fileConvertInfo.getFileDirPath() + "split_" + (i + 1) + ".jpeg", SaveFormat.JPEG);
}

ppt分頁轉(zhuǎn)換圖片

Presentation ppt = new Presentation(fileConvertInfo.getFilePath());
    for (int i = 0; i < ppt.getSlides().size(); i++) {
       ISlide slide = ppt.getSlides().get_Item(i);
       int height = (int) (ppt.getSlideSize().getSize().getHeight() - 150);
       int width = (int) (ppt.getSlideSize().getSize().getWidth() - 150);
       BufferedImage image = slide.getThumbnail(new java.awt.Dimension(width, height));
       //每一頁輸出一張圖片
       File outImage = new File(fileConvertInfo.getFileDirPath() + "split_" + (i + 1) + ".jpeg");
       ImageIO.write(image, "jpeg", outImage);
}

excel轉(zhuǎn)換html

Workbook wb = new Workbook(fileConvertInfo.getFilePath());
HtmlSaveOptions opts = new HtmlSaveOptions();
opts.setExportWorksheetCSSSeparately(true);
opts.setExportSimilarBorderStyle(true);
Worksheet ws = wb.getWorksheets().get(0);
wb.save(fileConvertInfo.getFileDirPath() + "convert.html", opts);

excel分頁轉(zhuǎn)換圖片(另一種預(yù)覽方式)

Workbook wb = new Workbook(fileConvertInfo.getFilePath());
ImageOrPrintOptions imgOptions = new ImageOrPrintOptions();
imgOptions.setImageFormat(ImageFormat.getJpeg());
for (int i = 0; i < wb.getWorksheets().getCount(); i++) {
	Worksheet sheet = wb.getWorksheets().get(i);
	SheetRender sr = new SheetRender(sheet, imgOptions);
    sr.toImage(i, fileConvertInfo.getFileDirPath() + "split_" + (i + 1) + ".jpeg");
}

pdf分頁轉(zhuǎn)換圖片

PDDocument pdf = PDDocument.load(new File((fileConvertInfo.getFilePath())));
int pageCount = pdf.getNumberOfPages();
PDFRenderer renderer = new PDFRenderer(pdf);
for (int i = 0; i < pageCount; i++) {
     BufferedImage image = renderer.renderImage(i, 1.25f); // 第二個(gè)參數(shù)越大生成圖片分辨率越高,轉(zhuǎn)換時(shí)間也就越長
     ImageIO.write(image, "JPEG", new File(fileConvertInfo.getFileDirPath() + "split_" + (i + 1) + ".jpeg"));
}
pdf.close();

預(yù)覽圖片

<body>
<div id="app">
    <img id="image"  style="display: none">
</div>
</body>

</html>
<script>
    $(function () {
        $("#image").attr("src", getQueryString("file"));
        var image = new Viewer(document.getElementById('image'),{
            url: 'data-original',
            button:false,
            navbar:false,
            backdrop: false
        });
        document.getElementById('image').click();
    })
</script>

預(yù)覽視頻

<body>
<div id="app">
    <video id="myvideo" class="video-js vjs-big-play-centered" controls data-setup="{}" width="1366" height="768" preload="auto">
        <source id="vedio" src="http://vjs.zencdn.net/v/oceans.mp4" type="video/mp4"></source>
    </video>
</div>
</body>

</html>
<script>
    $(function () {
        $("#vedio").attr("src", getQueryString("file"));
    })
</script>

系統(tǒng)效果

使用方法

直接運(yùn)行項(xiàng)目,輸入預(yù)覽地址

http://localhost:8098/fastpreview/plaform/index.html?file=(文件地址)

文件地址支持文件訪問路徑與流輸出

項(xiàng)目源碼地址

gitee.com/code2roc/fa…

預(yù)覽界面

word

excel

ppt

pdf

image

vedio

txt

總結(jié)

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)文件在線預(yù)覽功能的文章就介紹到這了,更多相關(guān)SpringBoot實(shí)現(xiàn)文件在線預(yù)覽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot如何接收前端傳來的json數(shù)據(jù)

    SpringBoot如何接收前端傳來的json數(shù)據(jù)

    這篇文章主要介紹了SpringBoot如何接收前端傳來的json數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java  實(shí)現(xiàn)輸出隨機(jī)圖片實(shí)例代碼

    java 實(shí)現(xiàn)輸出隨機(jī)圖片實(shí)例代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)輸出隨機(jī)圖片實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)

    SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)

    這篇文章主要介紹了如何使用SpringBoot整合Quartz,并將定時(shí)任務(wù)寫入庫中(持久化存儲(chǔ)),還可以任意對(duì)定時(shí)任務(wù)進(jìn)行如刪除、暫停、恢復(fù)等操作,需要的可以了解下
    2023-09-09
  • java自動(dòng)生成編號(hào)的實(shí)現(xiàn)(格式:yyMM+四位流水號(hào))

    java自動(dòng)生成編號(hào)的實(shí)現(xiàn)(格式:yyMM+四位流水號(hào))

    這篇文章主要介紹了java自動(dòng)生成編號(hào)的實(shí)現(xiàn)(格式:yyMM+四位流水號(hào)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • SpringCloud分布式鏈路跟蹤的方法

    SpringCloud分布式鏈路跟蹤的方法

    這篇文章主要介紹了SpringCloud分布式鏈路跟蹤的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Java持久層框架Mybatis入門詳細(xì)教程

    Java持久層框架Mybatis入門詳細(xì)教程

    Mybatis持久層框架支持自定義SQL、存儲(chǔ)過程以及高級(jí)映射,可以通過XML或注解來配置和映射原始類型、接口和Java POJOs為數(shù)據(jù)庫中的記錄,接下來通過本文給大家介紹Java持久層框架Mybatis入門詳細(xì)教程,一起學(xué)習(xí)下吧
    2021-06-06
  • 使用Java如何將圖片轉(zhuǎn)成Base64編碼,并壓縮至40k

    使用Java如何將圖片轉(zhuǎn)成Base64編碼,并壓縮至40k

    這篇文章主要介紹了使用Java如何將圖片轉(zhuǎn)成Base64編碼,并壓縮至40k問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解如何提升SpringBoot項(xiàng)目的吞吐量

    詳解如何提升SpringBoot項(xiàng)目的吞吐量

    吞吐量是指系統(tǒng)在單位時(shí)間內(nèi)成功處理請(qǐng)求的數(shù)量,當(dāng)吞吐量不足以應(yīng)對(duì)業(yè)務(wù)需求時(shí),會(huì)導(dǎo)致請(qǐng)求Pile Up的情況發(fā)生,使系統(tǒng)不可用甚至宕機(jī),所以提高吞吐量是保證系統(tǒng)可用性的有效手段之一,本文就給大家講講如何提升SpringBoot項(xiàng)目的吞吐量
    2023-07-07
  • JavaGUI模仿QQ聊天功能完整版

    JavaGUI模仿QQ聊天功能完整版

    這篇文章主要為大家詳細(xì)介紹了JavaGUI模仿QQ聊天功能完整版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 解決IDEA錯(cuò)誤 Cause: java.sql.SQLException: The server time zone value的問題

    解決IDEA錯(cuò)誤 Cause: java.sql.SQLException: The server time zone

    這篇文章主要介紹了解決IDEA錯(cuò)誤 Cause: java.sql.SQLException: The server time zone value的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

衡山县| 阿拉善盟| 金山区| 株洲市| 阿拉善盟| 北碚区| 米林县| 虞城县| 绥滨县| 思南县| 岳西县| 延吉市| 彰化市| 江口县| 衡阳县| 修武县| 施秉县| 宁海县| 江口县| 会同县| 鄂尔多斯市| 凤庆县| 乌什县| 榆树市| 济源市| 勐海县| 洪雅县| 嘉义市| 阜康市| 民和| 奉贤区| 温宿县| 册亨县| 南乐县| 柳林县| 曲沃县| 康乐县| 阜康市| 淮北市| 花莲市| 木里|