亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

前端使用axios實(shí)現(xiàn)下載文件功能的詳細(xì)過程

 更新時(shí)間:2022年08月01日 13:16:40   作者:柯曉楠  
項(xiàng)目中經(jīng)常會(huì)遇到需要導(dǎo)出列表內(nèi)容,或者下載文件之類的需求,下面這篇文章主要給大家介紹了關(guān)于前端使用axios實(shí)現(xiàn)下載文件功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

1、需求描述

在前后端分離開發(fā)的項(xiàng)目中,前端無論使用Vue或React哪種框架,發(fā)送HTTP請求都會(huì)使用Ajax異步請求的方式。在很多項(xiàng)目中都會(huì)選擇使用 axios 發(fā)送請求。但是在使用 axios 實(shí)現(xiàn)下載功能時(shí),往往會(huì)出現(xiàn)以下問題。

當(dāng)前端直接使用 axios 去請求下載文件的 api 接口時(shí),狀態(tài)碼返回200,但是獲取的數(shù)據(jù)卻是一堆亂碼,效果如下:

2、問題分析

下載其實(shí)是瀏覽器的內(nèi)置事件,瀏覽器的 GET請求(frame、a)、 POST請求(form)具有如下特點(diǎn):

  • response 會(huì)交由瀏覽器處理;
  • response 內(nèi)容可以為二進(jìn)制文件、字符串等。

但是AJAX請求不一樣:

  • response 會(huì)交由 Javascript 處理;
  • response 內(nèi)容只能接收字符串才能繼續(xù)處理。

因此,AJAX本身無法觸發(fā)瀏覽器的下載功能。

3、解決方案

要在 axios 的 config 配置 responseType: ‘blob’ (非常關(guān)鍵),服務(wù)端讀取文件,以 content-type: ‘application/octet-stream’ 的格式返回前端,前端接收到數(shù)據(jù)后使用 Blob 來接收數(shù)據(jù),并且創(chuàng)建a標(biāo)簽進(jìn)行下載。

一個(gè)對象的類型取決于 responseType 的值,當(dāng)值為 “blob”時(shí)表示 response 是一個(gè)包含二進(jìn)制數(shù)據(jù)的 Blob 對象。
在使用 axios 發(fā)起請求前,首先了解一下 responseType 這個(gè)屬性是如何在 axios 中使用的。以 axios 最常用的 get 和 post 請求為例,這兩種請求方式在傳遞參數(shù)的時(shí)候也是不同的:
在get請求當(dāng)中,config 是第二個(gè)參數(shù),而到了 post 里 config 變成了第三個(gè)參數(shù),這是傳遞 responseType 第一個(gè)需要注意的地方。

4、代碼實(shí)現(xiàn)

后端實(shí)現(xiàn)以 express 為例:

// 這里以express舉例
const fs = require('fs')
const express = require('express')
const bodyParser = require('body-parser')

const app = express()
app.use(bodyParser.urlencoded({extended: false}))
app.use(bodyParser.json())

// 以post提交舉例
app.post('/info/download', function(req, res) {
    const filePath = './myfile/test.zip'
    const fileName = 'test.zip'
    
    res.set({
        'content-type': 'application/octet-stream',
        'content-disposition': 'attachment;filename=' + encodeURI(fileName)
    })

    fs.createReadStream(filePath).pipe(res)
})

app.listen(3000)

前端在使用 axios 請求下載文件 api 接口時(shí),一定要區(qū)分不同請求方法的使用,語法如下:

// axios設(shè)置reponseType的方式應(yīng)該類似下面
const url = '/info/download'

// get、delete、head 等請求
axios.get(url, {params: {}, responseType: 'blob'})
    .then((res) => {})
    .catch((err) => {})

// post、put、patch 等請求
axios.post(url, {...params}, {responseType: 'blob'})
    .then((res) => {})
    .catch((err) => {})

前端解析數(shù)據(jù)流,主要使用 Blob 對象來進(jìn)行接收,示例代碼如下:

// 以之前的post請求舉例
axios.post(url, {...someData}, {responseType: 'blob'})
    .then((res) => {
        const { data, headers } = res
        const fileName = headers['content-disposition'].replace(/\w+;filename=(.*)/, '$1')
        // 此處當(dāng)返回json文件時(shí)需要先對data進(jìn)行JSON.stringify處理,其他類型文件不用做處理
        //const blob = new Blob([JSON.stringify(data)], ...)
        const blob = new Blob([data], {type: headers['content-type']})
        let dom = document.createElement('a')
        let url = window.URL.createObjectURL(blob)
        dom.href = url
        dom.download = decodeURI(fileName)
        dom.style.display = 'none'
        document.body.appendChild(dom)
        dom.click()
        dom.parentNode.removeChild(dom)
        window.URL.revokeObjectURL(url)
    }).catch((err) => {})

如果后臺(tái)返回的流文件是一張圖片的話,前端需要將這張圖片直接展示出來,例如登錄時(shí)的圖片驗(yàn)證碼,示例代碼如下:

axios.post(url, {...someData}, {responseType: 'blob'})
    .then((res) => {
        const { data } = res
        const reader = new FileReader()
        reader.readAsDataURL(data)
        reader.onload = (ev) => {
            const img = new Image()
            img.src = ev.target.result
            document.body.appendChild(img)
        }
    }).catch((err) => {})

總結(jié)

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

相關(guān)文章

  • 探究JavaScript中的五種事件處理程序方式

    探究JavaScript中的五種事件處理程序方式

    本篇文章主要介紹了JavaScript中的五種事件處理程序方式,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-12-12
  • JavaScript?Promise多并發(fā)問題的解決方法詳解

    JavaScript?Promise多并發(fā)問題的解決方法詳解

    提起控制并發(fā),大家應(yīng)該不陌生,這篇文章主要來和大家介紹一下JavaScript如何解決Promise多并發(fā)問題,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • 一文了解你不知道的JavaScript生成器篇

    一文了解你不知道的JavaScript生成器篇

    ES6引入了一個(gè)新的函數(shù)類型,發(fā)現(xiàn)它并不符合這種運(yùn)行到結(jié)束的特性。這類新的函數(shù)被稱為生成器。生成器的出現(xiàn)是我們知道原來有時(shí)代碼并不會(huì)順利的運(yùn)行,可以通過暫停的方式進(jìn)行異步回調(diào),讓我們摒棄了此前的認(rèn)知。本文就來聊聊JavaScript中生成器的相關(guān)知識
    2022-11-11
  • js實(shí)現(xiàn)簡單的放大鏡效果

    js實(shí)現(xiàn)簡單的放大鏡效果

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡單的放大鏡效果,可隨意更改,放大區(qū)域的大小、比例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 在JavaScript中通過URL傳遞漢字的方法

    在JavaScript中通過URL傳遞漢字的方法

    在JavaScript中通過URL傳遞漢字的方法...
    2007-04-04
  • 可浮動(dòng)QQ在線客服

    可浮動(dòng)QQ在線客服

    比較漂亮的qq在線客服代碼,推薦使用
    2008-10-10
  • JavaScript上傳文件時(shí)不用刷新頁面方法總結(jié)(推薦)

    JavaScript上傳文件時(shí)不用刷新頁面方法總結(jié)(推薦)

    這篇文章主要介紹了JavaScript上傳文件時(shí)不用刷新頁面方法,用js+css代碼詳細(xì)介紹了操作過程,需要的朋友可以參考下
    2017-08-08
  • JS簡易計(jì)算器實(shí)例講解

    JS簡易計(jì)算器實(shí)例講解

    這篇文章主要為大家詳細(xì)介紹了JS簡易計(jì)算器實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 深入了解javascript 數(shù)組的sort方法

    深入了解javascript 數(shù)組的sort方法

    在javascript中,數(shù)組對象有一個(gè)有趣的方法sort,它接收一個(gè)類型為函數(shù)的參數(shù)作為排序的依據(jù)。這意味著開發(fā)者只需要關(guān)注如何比較兩個(gè)值的大小,而不用管排序這件事內(nèi)部是如何實(shí)現(xiàn)的
    2018-06-06
  • Javascript中arguments用法實(shí)例分析

    Javascript中arguments用法實(shí)例分析

    這篇文章主要介紹了Javascript中arguments用法,實(shí)例分析了javascript利用arguments實(shí)現(xiàn)模擬重載功能,需要的朋友可以參考下
    2015-06-06

最新評論