js實現(xiàn)base64文件的處理以及下載方法
更新時間:2024年07月09日 11:09:07 作者:今后剛睡醒
Base64是一種將二進制數(shù)據(jù)編碼為ASCII字符的編碼方式,這篇文章主要給大家介紹了關于js實現(xiàn)base64文件的處理以及下載的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
獲取完整base64地址
//獲取后端返回的不完成base64、文件名、文件類型 function downladBase64(item) { APINAME().then((res) => { let base64 = getBase64Type(res.data.fileType) + res.data.data //類型拼接后端給的不完整base64 console.log('拼接完整的base64', base64) downloadFileByBase64(base64, res.data.fileName) }) } //根據(jù)文件后綴 獲取base64前綴不同 拼接完整的base64 function getBase64Type(type) { switch (type) { case 'txt': return 'data:text/plain;base64,' case 'doc': return 'data:application/msword;base64,' case 'docx': return 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,' case 'xls': return 'data:application/vnd.ms-excel;base64,' case 'xlsx': return 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' case 'pdf': return 'data:application/pdf;base64,' case 'pptx': return 'data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,' case 'ppt': return 'data:application/vnd.ms-powerpoint;base64,' case 'png': return 'data:image/png;base64,' case 'jpg': return 'data:image/jpeg;base64,' case 'gif': return 'data:image/gif;base64,' case 'svg': return 'data:image/svg+xml;base64,' case 'ico': return 'data:image/x-icon;base64,' case 'bmp': return 'data:image/bmp;base64,' } }
base64轉Blob
//將完整的base64轉換為blob function dataURLtoBlob(dataurl) { var arr = dataurl.split(","), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n) while (n--) { u8arr[n] = bstr.charCodeAt(n) } return new Blob([u8arr], { type: mime }) }
base64轉File
// 將base64轉換為文件 export default async function base64ImgtoFile(dataurl, filename = 'file') { try { const arr = dataurl.split(',') const mime = arr[0].match(/:(.*?);/)[1] const suffix = mime.split('/')[1] const bstr = atob(arr[1]) let n = bstr.length const u8arr = new Uint8Array(n) while (n--) { u8arr[n] = bstr.charCodeAt(n) } return new File([u8arr], `${filename}.${suffix}`, { type: mime }) } catch (err) { return Promise.reject(err); } }
下載base64文件
// * desc: 下載參數(shù)入口 // * @param base64 :返回數(shù)據(jù)的blob對象或鏈接 // * @param fileName :下載后文件名標記 function downloadFileByBase64(base64, fileName) { var myBlob = dataURLtoBlob(base64) var myUrl = URL.createObjectURL(myBlob) downloadFile(myUrl, fileName) } // * desc: 下載方法 // * @param url :返回數(shù)據(jù)的blob對象或鏈接 // * @param fileName :下載后文件名標記 function downloadFile(url, name = "What's the fuvk") { console.log('url==', url) var a = document.createElement("a") a.setAttribute("href", url) a.setAttribute("download", name) a.setAttribute("target", "_blank") let clickEvent = document.createEvent("MouseEvents") clickEvent.initEvent("click", true, true) a.dispatchEvent(clickEvent) } export default downloadFileByBase64
下載圖片
export const downloadImage = (imgsrc, name) => { // 下載圖片地址和圖片名 var image = new Image() image.setAttribute('crossOrigin', 'anonymous') image.onload = function() { var canvas = document.createElement('canvas') canvas.width = image.width canvas.height = image.height var context = canvas.getContext('2d') context.drawImage(image, 0, 0, image.width, image.height) var url = canvas.toDataURL('image/png') // 得到圖片的base64編碼數(shù)據(jù) var a = document.createElement('a') // 生成一個a元素 var event = new MouseEvent('click') // 創(chuàng)建一個單擊事件 a.download = name || 'photo' // 設置圖片名稱 a.href = url // 將生成的URL設置為a.href屬性 a.dispatchEvent(event) // 觸發(fā)a的單擊事件 } image.src = imgsrc }
下載普通文件
/** * 下載文件 * * @param {*} path 下載地址/下載請求地址。 * @param {string} [name='name.jpg'] 下載文件的名字(考慮到兼容性問題,最好加上后綴名 */ export const downloadFile = (path, name = 'name.jpg') => { const download = (href) => { const a = document.createElement('a') a.style.display = 'none' a.href = href a.download = name document.body.appendChild(a) a.click() document.body.removeChild(a) } if (isIE()) { download(path) } else { const xhr = new XMLHttpRequest() xhr.open('get', path) xhr.responseType = 'blob' xhr.send() xhr.onload = (e) => { const { status, response } = e.target if (status === 200 || status === 304) { const fileReader = new FileReader() fileReader.readAsDataURL(response) fileReader.onload = (ev) => { download(ev.target.result) } } } } } // 判斷是否IE export function isIE() { return /msie|trident/.test(window.navigator.userAgent.toLowerCase()) }
批量下載文件并導出為zip
import JSZip from 'jszip' import FileSaver from 'file-saver' import axios from 'axios' // 批量導出 function getFile(url) { return new Promise((resolve, reject) => { axios({ method: 'get', url, responseType: 'arraybuffer' }).then(data => { resolve(data.data) }).catch(error => { console.log(error, url, 'getfile-err') // reject(error.toString()); resolve('') }) }) } /** * * @param {Array} files 需要下載的文件對象數(shù)組[{name,url}] * @param {String} zipName 壓縮包名稱 * @param {Function} callback 下載完成后的回調 */ function batchDownZip(files, zipName, callback) { const data = files const zip = new JSZip() const cache = {} const promises = [] data.forEach(item => { // console.log(getFile, 'getFile') const promise = getFile(item.url).then(result_file => { // 下載文件, 并存成ArrayBuffer對象 let file_name = item.name // 獲取文件名 let lastIndex = file_name.lastIndexOf('/') console.log(result_file, file_name, lastIndex, 'result_file111') //將所有文件放入同一級 if (lastIndex > -1) { file_name = file_name.slice(lastIndex + 1) } console.log(result_file, file_name, lastIndex, 'result_file222') zip.file(file_name, result_file, { binary: true }) // 逐個添加文件 cache[file_name] = data }) promises.push(promise) }) Promise.all(promises).then(() => { zip.generateAsync({ type: 'blob' }).then(content => { // 生成二進制流 FileSaver.saveAs(content, zipName) // 利用file-saver保存文件 自定義文件名 callback && callback() }) }) } export default batchDownZip
總結
到此這篇關于js實現(xiàn)base64文件的處理以及下載方法的文章就介紹到這了,更多相關js base64文件處理下載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
相關文章
深入理解JavaScript系列(13) This? Yes,this!
在這篇文章里,我們將討論跟執(zhí)行上下文直接相關的更多細節(jié)。討論的主題就是this關鍵字。實踐證明,這個主題很難,在不同執(zhí)行上下文中this的確定經(jīng)常會發(fā)生問題2012-01-01關于TypeScript中import JSON的正確姿勢詳解
2012年10月首度對外公布typescript(當時已經(jīng)是0.7?的版本)同時開源,ts的編譯器是用js編寫的(后來改成ts?),可以在線編寫。下面這篇文章主要給大家介紹了關于TypeScript中import JSON的正確姿勢,需要的朋友可以參考下。2017-07-07