国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

通過(guò) Blob 對(duì)二進(jìn)制流文件下載實(shí)現(xiàn)文件保存下載

這篇具有很好參考價(jià)值的文章主要介紹了通過(guò) Blob 對(duì)二進(jìn)制流文件下載實(shí)現(xiàn)文件保存下載。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

原理前端將二進(jìn)制文件做轉(zhuǎn)換實(shí)現(xiàn)下載:請(qǐng)求后端接口->接收后端返回的二進(jìn)制流(通過(guò)二進(jìn)制流(Blob)下載, 把后端返回的二進(jìn)制文件放在 Blob 里面)->再通過(guò)file-saver插件保存

需求背景

業(yè)務(wù):下載模板文件

頁(yè)面上使用:

<span @click="downloadFile">下載當(dāng)前文件模板</span>

downloadFile() {
	let dowloadUrl
	if (this.dowloadUrl) {
	    dowloadUrl = this.dowloadUrl 
	}else if (this.fullPathUrl) {
	    dowloadUrl = this.fullPathUrl
	}
   downloadGet(dowloadUrl, `${this.fileName}.csv`, {})
},

通過(guò) Blob 對(duì)二進(jìn)制流文件下載實(shí)現(xiàn)文件保存下載,前端

保存文件:

import { saveAs } from 'file-saver'

發(fā)起請(qǐng)求通用方法(更改 axios 的 responseType):

本次業(yè)務(wù)需求中,直接使用 以下form標(biāo)簽形式下載(瀏覽器直接解析直接下載)會(huì)有文件訪問(wèn)權(quán)限問(wèn)題,所以轉(zhuǎn)換為發(fā)起axios請(qǐng)求接收二進(jìn)制流的方式。

<!-- <form v-show="false" id="templateForm" :action="templateUrl" method="get" /> -->

(post請(qǐng)求僅供參考,本次業(yè)務(wù)需求中沒(méi)有用到)

// 通用下載方法,blob形式--【post請(qǐng)求】
export function download(url, params, filename, config) {
  downloadLoadingInstance = Loading.service({
    text: '正在下載數(shù)據(jù),請(qǐng)稍候',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)'
  })
  return service
    .post(url, params, {
      transformRequest: [
        (params) => {
          return tansParams(params)
        }
      ],
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      responseType: 'blob', // 指定響應(yīng)類型為二進(jìn)制數(shù)據(jù)
      ...config
    })
    .then(async(data) => {
      const isLogin = await blobValidate(data)
      if (isLogin) {
        const blob = new Blob([data])
        saveAs(blob, filename)
      } else {
        const resText = await data.text()
        const rspObj = JSON.parse(resText)
        const errMsg =
          errorCode[rspObj.code] || rspObj.msg || errorCode['default']
        Message.error(errMsg)
      }
      downloadLoadingInstance.close()
    })
    .catch((r) => {
      console.error(r)
      Message.error('下載文件出現(xiàn)錯(cuò)誤,請(qǐng)聯(lián)系管理員!')
      downloadLoadingInstance.close()
    })
}

本次業(yè)務(wù)需求中,后端接口定義的get請(qǐng)求,所以前端發(fā)起axios-get請(qǐng)求:

// 通用下載方法,blob形式--【get請(qǐng)求】
export function downloadGet(url, filename, config) {
  downloadLoadingInstance = Loading.service({
    text: '正在下載數(shù)據(jù),請(qǐng)稍候',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)'
  })
  return service
    .get(url, {
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      responseType: 'blob',// 指定響應(yīng)類型為二進(jìn)制數(shù)據(jù)
      ...config
    })
    .then(async(data) => {
      const isLogin = await blobValidate(data)
      if (isLogin) {
        const blob = new Blob([data])
        saveAs(blob, filename)
      } else {
        const resText = await data.text()
        const rspObj = JSON.parse(resText)
        const errMsg =
          errorCode[rspObj.code] || rspObj.msg || errorCode['default']
        Message.error(errMsg)
      }
      downloadLoadingInstance.close()
    })
    .catch((r) => {
      console.error(r)
      Message.error('下載文件出現(xiàn)錯(cuò)誤,請(qǐng)聯(lián)系管理員!')
      downloadLoadingInstance.close()
    })
}

封裝的方法:

/**
* 參數(shù)處理
* @param {*} params  參數(shù)
*/
export function tansParams(params) {
  let result = ''
  for (const propName of Object.keys(params)) {
    const value = params[propName]
    var part = encodeURIComponent(propName) + '='
    // if (value !== null && value !== "" && typeof (value) !== "undefined") {
    if (value !== null && typeof (value) !== 'undefined') {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && value[key] !== '' && typeof (value[key]) !== 'undefined') {
            const params = propName + '[' + key + ']'
            var subPart = encodeURIComponent(params) + '='
            result += subPart + encodeURIComponent(value[key]) + '&'
          }
        }
      } else {
        result += part + encodeURIComponent(value) + '&'
      }
    }
  }
  return result
}

// 驗(yàn)證是否為blob格式
export async function blobValidate(data) {
  try {
    const text = await data.text()
    JSON.parse(text)
    return false
  } catch (error) {
    return true
  }
}


// errorCode.js: 
export default {
  '401': '認(rèn)證失敗,無(wú)法訪問(wèn)系統(tǒng)資源',
  '403': '當(dāng)前操作沒(méi)有權(quán)限',
  '404': '訪問(wèn)資源不存在',
  'default': '系統(tǒng)未知錯(cuò)誤,請(qǐng)反饋給管理員'
}

點(diǎn)擊"下載"按鈕:

通過(guò) Blob 對(duì)二進(jìn)制流文件下載實(shí)現(xiàn)文件保存下載,前端
通過(guò) Blob 對(duì)二進(jìn)制流文件下載實(shí)現(xiàn)文件保存下載,前端
通過(guò) Blob 對(duì)二進(jìn)制流文件下載實(shí)現(xiàn)文件保存下載,前端

相關(guān)技術(shù)

Blob
概念: Blob 對(duì)象表示一個(gè)不可變的, 原始數(shù)據(jù)的類文件對(duì)象,它的數(shù)據(jù)可以按文本或二進(jìn)制格式進(jìn)行讀取。

Blob 構(gòu)造函數(shù)

const aBlob = new Blob(array, option)

第一個(gè)參數(shù)是一個(gè)類數(shù)組, 必填
第二個(gè)參數(shù)非必填有兩個(gè)屬性: type, 表示MIME類型, 默認(rèn)值是’'。還有一個(gè)是endings 表示 /n 換行符如何被寫(xiě)入,默認(rèn)值是’transparent’保持不變, 還有’native’按照宿主機(jī)的換行符

總結(jié)

前端實(shí)現(xiàn)文件的下載主要有兩種方式:(1)直接打開(kāi)下載鏈接(通過(guò)瀏覽器解析方式直接下載);(2)通過(guò) Blob 對(duì)二進(jìn)制流文件下載。實(shí)際用那種方法可以看后端的返回值和請(qǐng)求方式

其他:

根據(jù)返回值構(gòu)造 Blob 函數(shù)并轉(zhuǎn)換成 URL ,動(dòng)態(tài)創(chuàng)建 a 標(biāo)簽打開(kāi) URL參考:
https://huaweicloud.csdn.net/63a55dc4b878a545459452ae.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-697043.html

到了這里,關(guān)于通過(guò) Blob 對(duì)二進(jìn)制流文件下載實(shí)現(xiàn)文件保存下載的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • js使用xlsx生成二進(jìn)制文件用于上傳(不下載)

    業(yè)務(wù)中經(jīng)常會(huì)處理各種數(shù)據(jù),本文介紹了前端通過(guò) xlsx 庫(kù)將數(shù)據(jù)轉(zhuǎn)換為 excel 文件用于上傳的實(shí)現(xiàn)。

    2024年02月13日
    瀏覽(91)
  • flask.send_file實(shí)現(xiàn)文件下載、文件傳輸和二進(jìn)制流傳輸

    flask.send_file實(shí)現(xiàn)文件下載、文件傳輸和二進(jìn)制流傳輸

    在使用flask框架時(shí),我們有時(shí)需要向前端傳輸文件?;蛘咝枰脩粼L問(wèn)一個(gè)url時(shí)直接下載文件。這時(shí)可以使用flask.send_file()函數(shù)來(lái)實(shí)現(xiàn)相關(guān)的操作。 path_or_file:需要發(fā)送的文件路徑或者二進(jìn)制文件對(duì)象 mimetype:文件的MIME類型,如果沒(méi)有設(shè)置,會(huì)嘗試根據(jù)文件名進(jìn)行檢測(cè) as_at

    2024年02月12日
    瀏覽(157)
  • 解決前端二進(jìn)制流下載的文件(例如:excel)打不開(kāi)的問(wèn)題

    解決前端二進(jìn)制流下載的文件(例如:excel)打不開(kāi)的問(wèn)題

    1. 現(xiàn)在后端請(qǐng)求數(shù)據(jù)后,返回了一個(gè)二進(jìn)制的數(shù)據(jù),我們要把它下載下來(lái)。 這是響應(yīng)的數(shù)據(jù): 2. 這是調(diào)用接口的地方: ?使用了file-saver插件:github地址 3. 這時(shí)如果直接下載的話,打開(kāi)文件就會(huì)失敗 4. 這時(shí)就必須要在調(diào)接口的時(shí)候做一下處理 responseType: \\\'arraybuffer\\\', 這個(gè)必須

    2024年02月04日
    瀏覽(340)
  • uniapp開(kāi)發(fā)小程序-pc端小程序下載后端接口的二進(jìn)制流文件

    fileName 包含文件名+后綴名,比如 test.png 這種格式 api.DownloadTmtFile 后端接口返回的是文件的二進(jìn)制流 值得注意的是,微信開(kāi)發(fā)者工具中是測(cè)試不了 wx.saveFileToDisk 的,需要真機(jī)或者體驗(yàn)版測(cè)試

    2024年02月04日
    瀏覽(24)
  • 文件流互相轉(zhuǎn)換(blob轉(zhuǎn)base64,二進(jìn)制流)

    文件流互相轉(zhuǎn)換(blob轉(zhuǎn)base64,二進(jìn)制流)

    跟用input上傳文件的獲取到的差不多 用URL.createObjectURL(blob)轉(zhuǎn)化后是這樣

    2024年02月10日
    瀏覽(23)
  • html 二進(jìn)制 blob 給圖片賦值

    1、html 二進(jìn)制流 (非base64),給圖片賦值 ? ? ? ? ? ? var reader = new FileReader(); ? ? ? ? ? ? reader.onload = function (e) { ? ? ? ? ? ? ? var img = document.querySelector(\\\'#canvas_img\\\'); ? ? ? ? ? ? ? img.src = e.target.result; ? ? ? ? ? ? }; ? ? ? ? ? ? // data 二進(jìn)流 ? ? ? ? ? ? reader.readAs

    2023年04月21日
    瀏覽(26)
  • C++:通過(guò)ofstream寫(xiě)入二進(jìn)制文件內(nèi)容

    C++:通過(guò)ifstream讀取二進(jìn)制文件內(nèi)容_c++ ifstream 二進(jìn)制讀取-CSDN博客 介紹了讀取二進(jìn)制文件的方法。 本文介紹一下寫(xiě)入二進(jìn)制數(shù)據(jù)到文件的方法: 1.通過(guò)write

    2024年01月19日
    瀏覽(23)
  • Vue前端處理blob二進(jìn)制對(duì)象圖片的方法

    Vue前端處理blob二進(jìn)制對(duì)象圖片的方法

    近期在做開(kāi)發(fā)的時(shí)候遇到一個(gè)問(wèn)題,前端傳遞一個(gè)參數(shù),后端返回一張圖片,前端再將該圖片展示出來(lái),由于是第一次處理二進(jìn)制圖片對(duì)象,特此記錄一下。 首先,已知后端接口無(wú)誤,傳遞參數(shù)可以正常返回圖片 ? ?前端調(diào)用接口,打印并查看獲取到的響應(yīng)數(shù)據(jù): ? ? 顯然

    2024年02月16日
    瀏覽(24)
  • uniapp小程序中處理blob二進(jìn)制流數(shù)據(jù)

    小程序中是不支持blob格式數(shù)據(jù)的,new Blob()會(huì)報(bào)錯(cuò)Blob未定義 處理方法是轉(zhuǎn)成base64格式: 首先,請(qǐng)求中要帶上responseType: \\\"arraybuffer\\\",保證返回的數(shù)據(jù)格式是arraybuffer 使用uni.arrayBufferToBase64() 轉(zhuǎn)化成base64格式,后續(xù)根據(jù)業(yè)務(wù)處理數(shù)據(jù)即可。 在這個(gè)代碼中,數(shù)據(jù)是一張png格式的二維

    2024年02月04日
    瀏覽(25)
  • Vue前端渲染blob二進(jìn)制對(duì)象圖片的方法

    Vue前端渲染blob二進(jìn)制對(duì)象圖片的方法

    近期做開(kāi)發(fā),聯(lián)調(diào)接口。接口返回的是一張圖片,是對(duì)二進(jìn)制圖片處理并渲染,特此記錄一下。 本文章是轉(zhuǎn)載文章,原文章:Vue前端處理blob二進(jìn)制對(duì)象圖片的方法 接口response是下圖 顯然,獲取到的是一堆亂碼,前端需要將其解析出來(lái),百度之后發(fā)現(xiàn)解析二進(jìn)制文檔流的寫(xiě)法

    2024年02月15日
    瀏覽(35)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包