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

Vue實現(xiàn)點擊按鈕下載文件的操作代碼(后端Java)

 更新時間:2021年08月17日 10:16:46   作者:Java盤魚宴  
最近項目中需要實現(xiàn)點擊按鈕下載文件的需求,前端用的vue后端使用的java代碼,今天通過本文給大家分享vue點擊按鈕下載文件的實現(xiàn)代碼,需要的朋友參考下吧

上篇文章給大家介紹過vue實現(xiàn)點擊按鈕下載文件功能,今天繼續(xù)vue點擊按鈕下載文件的話題。

最近項目中需要實現(xiàn)點擊按鈕下載文件的需求,前端用的vue,因為文件是各種類型的,比如圖片、pdf、word之類的。這里后端是可以返回文件的地址給前端的,但我看了下網(wǎng)上各種五花八門的答案,感覺都不是我想要的。

因為不確定文件是哪種類型的,所以我們在保存文件到數(shù)據(jù)庫的時候,應(yīng)該把文件的 Content-Type 一起存入,這樣從數(shù)據(jù)庫取出返回前端的時候,帶上 Content-Type 標(biāo)識是哪種類型的文件,前端解析即可。

1、后端代碼

這里我先寫后端的接口,考慮一下后端需要什么東西。因為文件信息已經(jīng)提前存入數(shù)據(jù)庫,所以我們只需要傳入主鍵id就可以拿到文件的信息。確定參數(shù)后,就需要確定一下返回值類型。這里可以使用 ResponseEntity 返回。 ResponseEntity 可以一次返回多個信息,包括狀態(tài)碼,響應(yīng)頭信息,響應(yīng)內(nèi)容等。

話不多說,看代碼。

/**
 * 下載附件
 * @param attachmentId
 * @return
 */
public ResponseEntity<byte[]> download(Long attachmentId) {
    // 查詢附件是否存在
    SysAttachment sysAttachment = sysAttachmentMapper.selectSysAttachmentById(attachmentId);
    if (StringUtils.isNull(sysAttachment)) {
        return null;
    }

    ByteArrayOutputStream bos = null;
    InputStream ins = null;
    try {
        String fileName = sysAttachment.getOrgFileName();
        String ossFileName = sysAttachment.getUrl();
        bos = new ByteArrayOutputStream();
        ins = OssUtils.getInstance().getObject(ossFileName).getObjectContent();
        // 取流中的數(shù)據(jù)
        int len = 0;
        byte[] buf = new byte[256];
        while ((len = ins.read(buf, 0, 256)) > -1) {
            bos.write(buf, 0, len);
        }

        // 防止中文亂碼
        fileName = URLEncoder.encode(fileName, "utf-8");
        // 設(shè)置響應(yīng)頭
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment;filename=" + fileName);
        headers.add("Content-Type", sysAttachment.getContentType());
        // 設(shè)置響應(yīng)嗎
        HttpStatus statusCode = HttpStatus.OK;
        ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(bos.toByteArray(), headers, statusCode);
        return response;
    } catch (Exception e) {
        throw new CustomException("下載失敗");
    } finally {
        try {
            if (ins != null) {
                ins.close();
            }
            if (bos != null) {
                bos.close();
            }
        } catch (Exception e) {
            throw new CustomException("下載失敗");
        }
    }
}

這里我們從數(shù)據(jù)庫拿出文件的url后,再通過阿里云oss拿到文件的輸入流,接著把文件輸出為二進(jìn)制,封裝到 ResponseEntity 中,并把文件的類型設(shè)置到 Content-Type 中,同時為了防止文件名帶有中文名亂碼,設(shè)置 utf-8 編碼,至此后端接口完成。

通過上面的信息,我們在數(shù)據(jù)庫保存文件信息時,至少應(yīng)該保存下面幾個字段:文件的url(一般在上傳到oss后會給你一個)、文件的類型、原始文件名、文件大小等。

2、前端代碼

有了后端接口,接下來就是前端了。這里可以把文件下載的方法封裝成一個通用方法全局掛載,之后需要使用的地方直接使用即可。

我們需要標(biāo)識不同的文件,所以我們需要一個鍵值對表示不同的文件。

const mimeMap = {
  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  xls: 'application/vnd.ms-excel',
  zip: 'application/zip',
  jpg: 'image/jpg',
  jpeg: 'image/jpeg',
  png: 'image/png',
  doc: 'application/msword',
  docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  ppt: 'application/vnd.ms-powerpoint',
  txt: 'text/plain',
  pdf: 'application/pdf'
}

有需要的可以繼續(xù)補(bǔ)充。接下來自然就是發(fā)請求了,這里的返回類型可以設(shè)置為 blob ,使用axios直接發(fā)送。

/**
 * 下載附件
 * @param path 接口地址
 * @param param  請求參數(shù)
 */
export function downloadAttachment(path, param) {
  var url = baseUrl + path + param
  axios({
    method: 'get',
    url: url,
    responseType: 'blob',
    headers: { 'Authorization': getToken() }
  }).then(res => {
    resolveBlob(res, res.data.type)
  })
}

接口地址和請求參數(shù)從外部傳入。同時需要攜帶token,不然會跨域訪問。拿到后端返回的數(shù)據(jù)后,需要解析二進(jìn)制文件,這里定義 resolveBlob 方法,該方法有兩個參數(shù),返回對象和文件的類型,文件的類型,我們在后端已經(jīng)放入 Content-Type 中了,這里直接取。

/**
 * 解析blob響應(yīng)內(nèi)容并下載
 * @param {*} res blob響應(yīng)內(nèi)容
 * @param {String} mimeType MIME類型
 */
export function resolveBlob(res, mimeType) {
  const aLink = document.createElement('a')
  var blob = new Blob([res.data], { type: mimeType })
  // 從response的headers中獲取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 設(shè)置的文件名;
  var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
  var contentDisposition = decodeURI(res.headers['content-disposition'])
  var result = patt.exec(contentDisposition)
  var fileName = result[1]
  fileName = fileName.replace(/\"/g, '')
  aLink.href = URL.createObjectURL(blob)
  aLink.setAttribute('download', fileName) // 設(shè)置下載文件名稱
  document.body.appendChild(aLink)
  aLink.click()
  document.body.removeChild(aLink);
}

這代碼不用多解釋了吧,前端大佬們自然看得懂。OK了啊,到這里前后端代碼都完成了。

3、使用

使用那就更簡單啦。先掛載到全局

import { downloadAttachment } from "@/utils/download"
Vue.prototype.downloadAttac = downloadAttachment

在使用的地方直接調(diào)用即可

<el-button
    type="text"
    icon="el-icon-download"
    size="mini"
    @click="downloadAttachRow(scope.row.attachmentId)"
    ></el-button>

/** 下載附件 */
downloadAttachRow(attachId) {
    this.$confirm('是否確認(rèn)下載該文件?', "警告", {
        confirmButtonText: "確定",
        cancelButtonText: "取消",
        type: "warning"
    }).then(() => {
        this.downloadAttac('/system/attachment/download/', attachId)
    }).then(() => {
        this.msgSuccess("下載成功")
    }).catch(() => {})
}

到此結(jié)束。

到此這篇關(guān)于Vue實現(xiàn)點擊按鈕下載文件的操作代碼(后端Java)的文章就介紹到這了,更多相關(guān)Vue點擊按鈕下載文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解vue-resource promise兼容性問題

    詳解vue-resource promise兼容性問題

    這篇文章主要介紹了詳解vue-resource promise兼容性問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 一文總結(jié)Vue和React的異同

    一文總結(jié)Vue和React的異同

    這篇文章主要介紹了Vue和React的相同點不不同點,文中對比介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • vue 解決addRoutes多次添加路由重復(fù)的操作

    vue 解決addRoutes多次添加路由重復(fù)的操作

    這篇文章主要介紹了vue 解決addRoutes多次添加路由重復(fù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • crypto-js對稱加密解密的使用方式詳解(vue與java端)

    crypto-js對稱加密解密的使用方式詳解(vue與java端)

    這篇文章主要介紹了如何在Vue前端和Java后端使用crypto-js庫進(jìn)行AES加密和解密,前端通過創(chuàng)建AES.js文件來實現(xiàn)加密解密功能,并在Vue文件或JavaScript中使用,后端則可以直接使用Java代碼進(jìn)行AES加密和解密操作,需要的朋友可以參考下
    2025-01-01
  • vue如何關(guān)閉eslint檢測(多種方法)

    vue如何關(guān)閉eslint檢測(多種方法)

    我們在開發(fā)vue項目的時候,創(chuàng)建的時候可能會不小心選擇了eslint,所以如果不想讓eslint檢測,我們該怎么辦呢,本文就詳細(xì)的介紹了幾種關(guān)閉方法,感興趣的可以了解一下
    2021-12-12
  • 創(chuàng)建Vue項目以及引入Iview的方法示例

    創(chuàng)建Vue項目以及引入Iview的方法示例

    這篇文章主要介紹了創(chuàng)建Vue項目以及引入Iview的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • vue使用@include或@mixin報錯的問題及解決

    vue使用@include或@mixin報錯的問題及解決

    這篇文章主要介紹了vue使用@include或@mixin報錯的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 基于Vue技術(shù)實現(xiàn)遞歸組件的方法

    基于Vue技術(shù)實現(xiàn)遞歸組件的方法

    這篇文章主要為大家詳細(xì)介紹了基于Vue技術(shù)實現(xiàn)遞歸組件的方法 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vue通過指令(directives)實現(xiàn)點擊空白處收起下拉框

    vue通過指令(directives)實現(xiàn)點擊空白處收起下拉框

    這篇文章主要介紹了vue通過指令(directives)實現(xiàn)點擊空白處收起下拉框,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 使用vue?v-for循環(huán)圖片路徑方式

    使用vue?v-for循環(huán)圖片路徑方式

    這篇文章主要介紹了使用vue?v-for循環(huán)圖片路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論

星子县| 昭觉县| 嘉善县| 孝感市| 新巴尔虎左旗| 衡东县| 芜湖市| 方正县| 顺昌县| 广汉市| 成都市| 武穴市| 宁蒗| 高平市| 利辛县| 洮南市| 杭州市| 新龙县| 简阳市| 永胜县| 吴忠市| 宣威市| 甘谷县| 临城县| 华蓥市| 温泉县| 宁远县| 金寨县| 耒阳市| 什邡市| 垣曲县| 建瓯市| 吴旗县| 时尚| 无极县| 通州市| 沿河| 隆德县| 双流县| 措勤县| 鄂州市|