前端 操作文件流實現(xiàn)上傳下載

工作中遇到的需求 和大家分享下

  • 以下代碼實現(xiàn)文件的上傳下載功能
  • 為了方便演示 DOM操作通過VUE實現(xiàn) 例子中保存為EXCEL文件

原始地址

詳細內(nèi)容 地址
作者 MaBond


HTML部分

<input 
    type="file" 
    style="display: none;"
    v-if="fileState"
    v-el:input  
    @change="checkFile"
>

<a href="javascript:;" class="btn"  @click="fileClick">點擊選擇</a>
<a href="javascript:;" class="btn"  @click="downLoad">點擊下載</a>
  • 注意 file文件的值只能寫一次 第二次選擇文件后不能觸發(fā) onchange事件 通過 v-if 從下生成 input 節(jié)點
  • 隱藏 input 通過 a標簽 觸發(fā)input的點擊事件 => 美化按鈕

JS部分

data(){
    fileState:true, // v-if="fileState"  重復生成 input 節(jié)點
},
methods:{
    fileClick(){
        let DOM = this.$els.input
        DOM.click() // checkFile
    },
    checkFile(){
        let DOM  = this.$els.input,
            file = DOM.files[0]              
            
            this.sendFile(file)    // 發(fā)送文件
            
            //重新生成 input 節(jié)點
            this.fileState = false
            window.setTimeout(()=>{
                this.fileState = true
            },200)
            
           
    },
    sendFile(file,id){  // 通過 XMLHttpRequest 發(fā)送  注意FormData
        let xhr = new XMLHttpRequest()
        let data = new FormData()  
        
        data.append("excel", file)
        data.append("fileID", id)
        
        xhr.onload = function () {
            if (xhr.status === 200 && xhr.status < 300 || xhr.status === 304) {
                try {
                    const data = JSON.parse(xhr.responseText)
                    callback(data)
                } catch(error) {
                    console.log(`errMsg:${error}`)
                }
            }
        }
        xhr.open("post", "www.sendFile.com", true)
        xhr.send(data)
    },
    downLoad(){
        let fileDate = this.getFile(`fileID=1`),
            blob     = new Blob([fileDate],{'type':'application/msexcel'}),  // [文件]{類型}
            a        = this.$els.download
        
        a.download = 'excel.xls'  // 下載的文件名
        a.href     = window.URL.createObjectURL(blob)
    },
    async getFile(params){  // 通過 fetch 接收  注意.blob()
        let response = await fetch("www.getFile.com", {
            method: "POST",
            credentials: "include",
            headers: {
              "Content-Type": "application/x-www-form-urlencoded"
            },
            body: params
        }).catch((error) => {
            console.error(error)
        })
        return await response.blob().catch((error) => {
            console.error(error)
        })
    },
}

參考

Fetch
Blob


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 下載安裝搭建環(huán)境 可以選npm安裝,或者簡單下載一個開發(fā)版的vue.js文件 瀏覽器打開加載有vue的文檔時,控制...
    冥冥2017閱讀 6,197評論 0 42
  • 我現(xiàn)在還能很清晰地溫習一些事情,我記得初到西北時,在前門下了火車以后,這古老的都市的影子,光禿禿的山頭,便像一個秤...
    芷墨l閱讀 445評論 9 30
  • 給新同事創(chuàng)建了一個jenkins賬號,自己登陸的時候發(fā)現(xiàn) user 沒有Overall/Read 權(quán)限,登錄不上,...
    HiIgor閱讀 1,192評論 0 0
  • 來是客, 去是客, 蓬頭浪子游四方。 心不堅, 何以作支撐? 左躊躇, 右躊躇, 回身四顧無親朋。 志不堅, 何以...
    香蕉芒果閱讀 190評論 0 0
  • 當綠樹成蔭 當筍高過竹 當嬰幼兒變成青年 當青絲中露出銀白 當臉龐被時光刻畫出深淺不一的痕跡 從前,大手牽小手 你...
    二零一久閱讀 296評論 0 1

友情鏈接更多精彩內(nèi)容