JS-文件下载,实现在ios也是下载 而不是预览,

这篇具有很好参考价值的文章主要介绍了JS-文件下载,实现在ios也是下载 而不是预览,。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求

通过A链接的方式,把从后台获取到的文件下载到本地,实现在移动端,PC端都能下载

问题

通过ajax请求后端生成的文件流之后,创建BLOB文件进行下载,在PC端和移动安卓端都可以实现下载到本地和对应的手机,而在IOS端的话,是直接预览对应的blob文件地址 而不是下载对应的文件流,解决在IOS上也能实现下载(仅限Safari浏览器)

步骤

1.通过request,responseType的值为 'arraybuffer',请求对应的文件流

uni.request({
				...handleRes,
				responseType: 'arraybuffer',
				success(res) {
					// console.log(res, '返回数据');
                    // 这是返回的文件流
					const file = res.data;
					
				},
				fail() {
					uni.hideLoading();
					
				}
			})

2.通过将文件流转成blob对象


					let blob = null;
					if (headerDis.indexOf(tyepList.toString()) != -1) {
						blob = new Blob([file], {
							type: 'application/octet-stream;charset=UTF-8',
						})
					} else {
						blob = new Blob([file], {
							type: headerInfo['content-type'] ||
								'application/octet-stream;charset=UTF-8',
						})
					}

3.通过创建A链接,通过download属性进行下载

async linkTodownloadFile(blob, fName) {
		if (window.navigator.msSaveOrOpenBlob) {
			window.navigator.msSaveBlob(blob, fName);
			return false;
		}

		const url = window.URL.createObjectURL(blob)
		const link = document.createElement('a')
		link.style.display = 'none'
		link.href = url;
		link.setAttribute('download', fName)
		document.body.appendChild(link)
		if (document.all) {
			link.click();
		} else {
			// 兼容 Firfox
			const evt = document.createEvent('MouseEvents');
			evt.initEvent('click', true, true);
			link.dispatchEvent(evt);
		}
		document.body.removeChild(link) // 下载完成移除元素
		window.URL.revokeObjectURL(url);
		uni.hideLoading();
		common.toast(107)
	}

注意:这里需要主要的在IOS端如果自定义blob的type的话  download属性就只加文件名 而不需要后缀,会形成双重后缀.而且如果类型为steam的话就会是预览  而设置成steam的话就会直接下载文件,也就是第二步做的判断原因文章来源地址https://www.toymoban.com/news/detail-718403.html

4.完整的代码

uni.request({
				url : 'xxx',
				responseType: 'arraybuffer',
				success(res) {
					// console.log(res, '返回数据');
					const file = res.data;
					const headerInfo = res.header;
					/** 获取文件名称 */
					let fName = '';
					/** 判断是否为可自定义类型还是默认 */
					const tyepList = ['pdf'];

					const headerDis = headerInfo['content-disposition'];

					if (headerDis) {
						const requestFileInfo = headerDis.split(';')[1];
						if (store.state.app.SYSTEM_INFO.platform == 'ios') {
							if (headerDis.indexOf(tyepList.toString()) != -1) {
								fName = requestFileInfo;
							} else {
								fName = requestFileInfo.split('.')[0];
							}

						} else {
							fName = requestFileInfo;
						}
					} else {
						/** 判断文件是否有类型,没有就拿效应头 */
						const fType = file.type || headerInfo['content-type'].split(';')[0];
						for (const key in fileTypeConfig) {
							if (fileTypeConfig[key].indexOf(fType) != -1) {
								if (store.state.app.SYSTEM_INFO.platform == 'ios') {
									fName = `${fileName}`;
								} else {
									fName = `${fileName}.${key}`;
								}
								break
							}
						}
					}

					/** 开始下载 */
					let blob = null;

					if (headerDis.indexOf(tyepList.toString()) != -1) {
						blob = new Blob([file], {
							type: 'application/octet-stream;charset=UTF-8',
						})
					} else {
						blob = new Blob([file], {
							type: headerInfo['content-type'] ||
								'application/octet-stream;charset=UTF-8',
						})
					}

					/** 判断是否为JSON 做逻辑处理 */
					if (fName.indexOf('json') != -1) {
						//通过FileReader读取数据
						const reader = new FileReader();
						// reader.readAsBinaryString(blob);
						reader.readAsText(blob, 'utf8');
						reader.onload = function() {
							var content = JSON.parse(this.result); //这个就是解析出来的数据
							if (content.code == 200) {
								// common.toast(fName);
								that.linkTodownloadFile(blob, fName);
								resolve();
							} else {
								isLoading && uni.hideLoading();
								common.toast(content.msg || 400);
							}
						}
					} else {
						// common.toast(fName);
						that.linkTodownloadFile(blob, fName);
						resolve();
					}
				},
				fail() {
					uni.hideLoading();
					common.toast(108)
					reject();
				}
			})

5.附件 fileTypeConfig的内容

export default {
	xls: 'application/vnd.ms-excel',
	xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
	csv: 'text/csv',
	doc: 'application/msword',
	docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
	pdf: 'application/pdf',
	ppt: 'application/vnd.ms-powerpoint',
	pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
	png: 'image/png',
	gif: 'image/gif',
	jpeg: 'image/jpeg',
	jpg: 'image/jpeg',
	mp3: 'audio/mpeg',
	aac: 'audio/aac',
	html: 'text/html',
	css: 'text/css',
	js: 'text/javascript',
	json: 'application/json',
	abw: 'application/x-abiword',
	arc: 'application/x-freearc',
	avi: 'video/x-msvideo',
	azw: 'application/vnd.amazon.ebook',
	bin: 'application/octet-stream',
	bmp: 'image/bmp',
	bz: 'application/x-bzip',
	bz2: 'application/x-bzip2',
	csh: 'application/x-csh',
	eot: 'application/vnd.ms-fontobject',
	epub: 'application/epub+zip',
	htm: 'text/html',
	ico: 'image/vnd.microsoft.icon',
	ics: 'text/calendar',
	jar: 'application/java-archive',
	jsonld: 'application/ld+json',
	mid: 'audio/midi audio/x-midi',
	midi: 'audio/midi audio/x-midi',
	mjs: 'text/javascript',
	mpeg: 'video/mpeg',
	mpkg: 'application/vnd.apple.installer+xml',
	odp: 'application/vnd.oasis.opendocument.presentation',
	ods: 'application/vnd.oasis.opendocument.spreadsheet',
	odt: 'application/vnd.oasis.opendocument.text',
	oga: 'audio/ogg',
	ogv: 'video/ogg',
	ogx: 'application/ogg',
	otf: 'font/otf',
	rar: 'application/x-rar-compressed',
	rtf: 'application/rtf',
	sh: 'application/x-sh',
	svg: 'image/svg+xml',
	swf: 'application/x-shockwave-flash',
	tar: 'application/x-tar',
	tif: 'image/tiff',
	tiff: 'image/tiff',
	ttf: 'font/ttf',
	txt: 'text/plain',
	vsd: 'application/vnd.visio',
	wav: 'audio/wav',
	weba: 'audio/webm',
	webm: 'video/webm',
	webp: 'image/webp',
	woff: 'font/woff',
	woff2: 'font/woff2',
	xhtml: 'application/xhtml+xml',
	xml: 'text/xml',
	xul: 'application/vnd.mozilla.xul+xml',
	zip: 'application/zip,application/x-zip-compressed',

}

到了这里,关于JS-文件下载,实现在ios也是下载 而不是预览,的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue 纯前端预览pdf,纯前端实现pdf加水印下载文件也带水印,防止pdf下载

      原理:主要是利用pdfh5这个插件来完成的   使用方法:   1.页面需要有一个容器例子:div id=\\\"demo\\\"/div   2.下载pdfh5插件 npm install pdfh5   (注意:webpack5之后不会下载polyfill 需要手动下载 所以引入pdfh5的时候会报错)   解决方案:下载 node-polyfill-webpack-plugin npm install node-polyfill-

    2024年04月15日
    浏览(68)
  • uniapp实现h5、app、微信小程序三端pdf文件下载和预览

    以下代码兼容三端,app,h5,微信小程序,经过个人测试 手机端有两种方法,使用renderjs或者uniapp的api 两者的区别 使用renderjs的写法,会提示用户是否下载文件,下载完成后用户需要手动点击下载的文件,才会打开文件 使用uniapp的api则可以直接下载并直接预览,不需要用户操

    2024年02月11日
    浏览(60)
  • node实战——koa实现文件下载和图片/pdf/视频预览(node后端储备知识)

    大家好,我是yma16,本文分享关于node实战——koa实现文件下载和图片预览。 本文适用对象 :前端初学者转node方向,在校大学生,即将毕业的同学,计算机爱好者。 node系列往期文章 node_windows环境变量配置 node_npm发布包 linux_配置node node_nvm安装配置 node笔记_http服务搭建(渲染

    2024年02月05日
    浏览(40)
  • js 实现多个文件循环下载 批量下载

    最近业务涉及勾选之后多个word文件下载 开始用的循环方式 怎么试都是下载最后一个文件 后来找到原因是 当循环执行下载的时候,几个下载命令连续执行的时候,浏览器会取消上一个下载,直接下载最后一个文件 。所以要加一个定时器,让几个连续的下载请求之间有时间间

    2024年02月11日
    浏览(49)
  • uniapp - 微信小程序平台实现预览 office 文件及保存下载到本地功能,将word/excel/ppt/pdf等文件在小程序内进行预览,用户可以保存和转发给好友进行下载到手机(一键复制运行)

    在uniapp微信小程序开发中,预览文件、下载文件并保存到手机本地功能(支持office全套word/pdf/ppt/excel等),兼容安卓和苹果端非常好用, 本文有2种方案,愿意用哪个就用哪个,都有示例代码和详细说明。

    2024年02月08日
    浏览(237)
  • JS实现Blob文件流下载

    在 JavaScript 中,可以使用浏览器提供的 Blob 对象和 URL.createObjectURL() 方法来实现文件流下载。 下面是一个示例代码,可以帮助了解如何在 JavaScript 中实现文件流下载: 在这个示例中,我们定义了一个 downloadFile() 函数,这个函数接受三个参数: data 、 filename 和 type 。其中,

    2024年02月15日
    浏览(54)
  • Flutter:文件上传与下载(下载后预览)

    dio是一个强大的Dart Http请求库,提供了丰富的功能和易于使用的API,支持文件上传和下载。 这个就不介绍了,网上有很多的封装案例。 简介 适用于iOS,Android,MacOS,Windows和Linux的后台文件下载器和上传器。 官方文档 https://pub-web.flutter-io.cn/packages/background_downloader 安装 注意:

    2024年02月13日
    浏览(64)
  • uniapp文件下载并预览

    大概就是这样的咯,文件展示到页面上,点击文件下载并预览该文件;   通过点击事件 handleDownLoad(file.path) ,file.path为文件的地址;   功能代码: 样式的话,大家根据自己需求写吧,我只功能代码展示出来就可以了;

    2024年02月13日
    浏览(51)
  • 微信小程序文件预览和下载-文件系统

    文件预览和下载 在下载之前,我们得先调用接口获取文件下载的 url 然后通过 wx.downloadFile 将下载文件资源到本地 tempFilePath 就是临时临时文件路径。 通过 wx.openDocument 打开文件。 showMenu 表示预览文件右上方的菜单,你可以在该菜单中选择保存文件,将文件显示的保存到本地

    2024年02月04日
    浏览(52)
  • 详解JS实现单个或多个文件批量下载的方法

    目录 0.JS简介 前言 单个文件Download 方案一:location.href or window.open 方案二:通过a标签的download属性 方案三:API请求 多个文件批量Download 方案一:按单个文件download方式,循环依次下载 方案二:前端打包成zip download 方案三:后端压缩成zip,然后以文件流url形式,前端调用dow

    2024年02月01日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包