上传js文件
| import axios from "axios"; |
| import SparkMD5 from "spark-md5"; |
| |
| const upload = (url, data, headers = {}) => { |
| return new Promise((resolve, reject) => { |
| axios({ |
| url, |
| method: "post", |
| data, |
| headers: { |
| ...headers, |
| "Content-Type": "multipart/form-data", |
| }, |
| }) |
| .then((res) => { |
| return resolve(res.data); |
| }) |
| .catch((err) => { |
| return reject(err); |
| }); |
| }); |
| }; |
| |
| const uploadByPieces = async (url, { fileName, file }) => { |
| |
| const chunkSize = 5 * 1024 * 1024; |
| const chunkCount = Math.ceil(file.size / chunkSize); |
| const fileMd5 = await getFileMd5(file); |
| |
| const getChunkInfo = (file, index) => { |
| let start = index * chunkSize; |
| let end = Math.min(file.size, start + chunkSize); |
| let chunk = file.slice(start, end); |
| return { start, end, chunk }; |
| }; |
| |
| const uploadChunk = (data) => { |
| return new Promise((resolve, reject) => { |
| axios({ |
| url, |
| method: "post", |
| data, |
| headers: { |
| "Content-Type": "multipart/form-data", |
| }, |
| }) |
| .then((res) => { |
| return resolve(res.data); |
| }) |
| .catch((err) => { |
| return reject(err); |
| }); |
| }); |
| }; |
| |
| const readChunk = async (index) => { |
| const { chunk } = getChunkInfo(file, index); |
| let fetchForm = new FormData(); |
| const chunkMd5 = await getFileMd5(chunk); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| fetchForm.append("chunkNumber", index); |
| fetchForm.append("identifier", fileMd5); |
| fetchForm.append("chunkSize", chunkSize); |
| fetchForm.append("currentChunkSize", chunk.size); |
| fetchForm.append("totalSize", file.size); |
| fetchForm.append("totalChunks", chunkCount); |
| fetchForm.append("fileName", chunkMd5 + "-" + index); |
| fetchForm.append("type", "csv"); |
| fetchForm.append("file", chunk); |
| |
| |
| |
| |
| |
| |
| |
| return uploadChunk(fetchForm); |
| }; |
| |
| const promiseList = []; |
| try { |
| for (let index = 0; index < chunkCount; ++index) { |
| promiseList.push(readChunk(index)); |
| } |
| const res = await Promise.all(promiseList); |
| return { res, fileMd5 }; |
| } catch (e) { |
| return e; |
| } |
| }; |
| |
| |
| |
| |
| |
| function getFileMd5(file) { |
| let fileReader = new FileReader(); |
| fileReader.readAsBinaryString(file); |
| let spark = new SparkMD5(); |
| return new Promise((resolve) => { |
| fileReader.onload = (e) => { |
| spark.appendBinary(e.target.result); |
| resolve(spark.end() + Date.now()); |
| }; |
| }); |
| } |
| |
| export { upload, uploadByPieces, getFileMd5 }; |
| |
调用上传方法
| beforeFileUpload(file) { |
| if (file.size < 5 * 1024 * 1024) { |
| this.commonUpload(); |
| } else { |
| this.piecesUpload(file); |
| } |
| return false; |
| }, |
| |
| async piecesUpload(file, isVerifiableSource = false) { |
| let url = "/api/xxxxx"; |
| let data = { |
| file, |
| fileName: file.name, |
| }; |
| |
| const loading = |
| this.$eleUtils.openFullScreenLoading("该文件较大,请耐心等待..."); |
| const res = await uploadByPieces(url, data); |
| loading.close(); |
| console.log(res); |
| |
| this.mergeFile(file, res.fileMd5, isVerifiableSource); |
| }, |
html代码
| <el-upload |
| action="" |
| accept=".csv" |
| :multiple="false" |
| :limit="1" |
| :show-file-list="false" |
| :before-upload="beforeFileUpload" |
| > |
| <el-button size="small" type="primary">点击上传</el-button> |
| <div slot="tip" class="el-upload__tip">提示</div> |
| </el-upload> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程