当前位置: 首页 > news >正文

dedecms网站栏目管理想做百度推广找谁

dedecms网站栏目管理,想做百度推广找谁,做网站的资料,王烨名字打分背景 文件管理页面,后端只提供了一个根据 file_path 和 file_name 参数下载文件的API接口。产品需要支持用户多选之后的批量下载功能。 技术实现 基础代码 先调用下载接口,获取到二进制的文件流,然后通过 a 标签完成下载。 // return [r…

背景

文件管理页面,后端只提供了一个根据 file_pathfile_name 参数下载文件的API接口。产品需要支持用户多选之后的批量下载功能。

技术实现

基础代码

先调用下载接口,获取到二进制的文件流,然后通过 a 标签完成下载。

// @return [response, error] 如果请求失败,则 error 有值,response 为null,否则 error 为null
const requestNormalFn = (url, method, data, {params = {}, requestConfig = {}, unitModuleName = null, deleteWithBody = false
} = {}) => {const requestUuid = genUuid()const reqBody = (method === 'delete' && !deleteWithBody) ? null : datareturn wrapAwait(myFetch.request({method, url, data: reqBody, params, requestConfig, requestUuid, unitModuleName}))
}// 通过 click a 标签下载文件
let downloadcount = 1
const saveDataToFileForHdf = (data, filename, ext) => {downloadcount ++let url = URL.createObjectURL(data);let link = document.createElement('a');link.setAttribute('href', url);link.setAttribute('download', `${filename}.${ext}`);link.addEventListener('click', function (e) {console.log('click', downloadcount, e.target)})document.body.appendChild(link);link.click();document.body.removeChild(link);
};

方案一

循环选中的行,在循环中调用下载文件的接口

const downloadFile = async row => {const [response, error] = await requestNormalFn(downloadUrl, 'get', null, {params: {file_path: row.file_path,file_name: row.file_name},requestConfig: {responseType: 'blob'}})if (error) {ElMessage({type: 'error',message: `${row.file_name}下载失败`})return}const fileNameArr = row.file_name.split('.')const ext = fileNameArr.splice(fileNameArr.length - 1, 1)const fileName = fileNameArr.join('.')saveDataToFileForHdf(response, fileName, ext[0])
}const onBatchDownloadClick = rows => {rows.forEach(row => downloadFile(row))
}

问题
当勾选的数据 >= 6时,就开始出现实际下载下来的文件数量小于勾选的数据量,能下载下来的文件数不稳定。

思考
有以下可能:

  1. 请求结果丢失 —— 后续验证被排除,没有丢失。
  2. 生成 a 标签的时候,click 这里被某种安全策略阻止 —— 后续证明,click 里面都能被打印出来。

所以那么最后只能指向下载文件的问题,查阅之后知道浏览器有安全策略,如果下载操作过于频繁或者数量过多,仍可能被视为不安全的操作而被阻止。

方案二

const requestFile = async row => {const [res, err] = await requestNormalFn(downloadUrl, 'get', null, {params: {file_path: row.file_path,file_name: row.file_name},requestConfig: {responseType: 'blob'}})return [res, err, row]
}const batchDownload = async (rows) => {const requestList = rows.map(row => requestFile(row))const resList = await Promise.allSettled(requestList)resList.forEach(res => {const [response, error, row] = res.valueif (error) {failedList.value.push(row.file_name)return}const fileNameArr = row.file_name.split('.')const ext = fileNameArr.splice(fileNameArr.length - 1, 1)const fileName = fileNameArr.join('.')saveDataToFileForHdf(response, fileName, ext[0])})if (failedList.value.length) {ElMessage({message: `${failedList.value.join(', ')} 下载失败。`,type: 'error'})}return [0, null]
}// 将长数组分片,进行处理
const dealPartForArray = async (list, cb, batchLength = 10) => {const splitNum = Math.ceil(list.length / batchLength)for (let i = 0; i < splitNum; i++) {const splitList = list.slice(i * batchLength, (i + 1) * batchLength)const [, err] = await cb(splitList)}
}
// 点击批量下载按钮的时候,将 选中的行 分片处理,每片最多6个数据
const onBatchDownloadClick = rows => {dealPartForArray(rows, batchDownload, 6)
}

这里最好wait一点时间之后,再执行下一个分片的下载。可以解决问题。但是提示信息需要优化,考虑一次的用户操作,更友好的提示用户。

方案三

交由后端处理,让后端提供批量下载的接口,这里要考虑到当批量下载回来的数据很大时,前端和后端需要做的事情。(下载压缩文件,以及返回数据的分片)

总结

最好是用方案三,如果后端不支持的话,再考虑方案二。

http://www.tj-hxxt.cn/news/116721.html

相关文章:

  • 成都有哪些做公司网站的公司摘抄一小段新闻
  • 做网站公司需要提供的资料网站主页
  • 做网站比较好的商品推广
  • 免费图纸网站深圳seo排名
  • 做中英文网站公司搜索百度一下
  • wordpress 总访问量关键词优化需要从哪些方面开展
  • 做一个公司网站一般多少钱石家庄百度快照优化
  • 做网站条件磁力宝
  • 百度不收录你的网站产品搜索引擎入口yandex
  • 徐州做网站哪里好推广员网站
  • 哪个网站做任务赚钱的中国最权威的网站排名
  • 医疗公司网站建设项目背景一键seo提交收录
  • 做信息发布类网站用什么语言苏州seo服务热线
  • 网站推广方案注意事项?免费建网站平台
  • 锦江会员通app下载seo的方式包括
  • 手机app开发最好的工具win7系统优化工具
  • 潮州哪里做网站中央常委成员名单
  • wordpress安装下载失败seo具体怎么优化
  • 用asp做网站有哪控件建一个网站大概需要多少钱
  • WordPress允许修改评论内容seo上海推广公司
  • 江苏省品牌专业建设网站浏览器下载
  • 德州做网站的公司有哪些seo优化招聘
  • 医疗网站设计网络营销专业培训学校
  • 五原网站建设竞价推广开户公司
  • 网站建设请款报告成都私人网站建设
  • 做网站虚拟主机百度图片识别在线使用
  • 深圳网站快速优化公司天津抖音seo
  • 南昌哪里可以做电商网站百度灰色关键词排名
  • 用墨刀做视频网站开通网站需要多少钱
  • 阿里云服务器多个网站广州seo工作