公司uniapp项目在调用接口下载文件的时候,这个接口通过网页浏览器访问是能够正常下载一个xlsx类型的文件。但是通过调用uni.downloadFile方法下载该文件时候,临时文件没有带上后缀,而且文件名称还是接口名称。

在uni.downloadFile的success回调方法中,打印了一下临时文件在手机中的路径。

plus.io.convertLocalFileSystemURL(res.tempFilePath)

在手机目录中查看的时候,这个文件是一个BIN文件,但是网页浏览器访问下载的时候,是一个xlsx文件。而且,也正是需要展示这个类型的文件。后面调用uni.openDocument方法打开文件时也总是打开失败。报错消息:“ fail not found 3th activity”没有找到对应的第三方软件来打开。尽管这个文件没有后缀,并且openDocument也指定了fileType为xlsx。

只能通过更改文件名称来解决这个办法。

// 拿到临时文件的绝对路径
let filepathss=plus.io.convertLocalFileSystemURL(res.tempFilePath);
// 通过这个路径来拿到他
plus.io.resolveLocalFileSystemURL(filepathss,function(entry){
	const tempFileName = entry.name;
	entry.getParent(function (parentDicEntry) {
		console.log(parentDicEntry.fullPath)
		entry.moveTo({ fullPath: parentDicEntry.fullPath+'/'},'新的文件名字.xlsx',function (newFile) {
			uni.openDocument({
				fileType: 'xlsx',
				filePath: newFile.fullPath,
				success: function (res2) {
					console.log('打开文档成功');
				},
				fail: function (err) {
					if(err.errCode == 1 || err.code == 1){
						uni.showToast({
							title: `未找到能打开xlsx类型文件的手机应用`,
							icon: 'none'
						})
					}
					console.log(err)
				}
			});
		},function(moveError){
			uni.showToast({
				title: `已在第三方应用中打开过,请在第三方应用查看时保存`,
				icon: 'none'
			})
		})
	})
})

上面这个方法并没有改变文件的路径,放在了相同的路径下面,取了一个新的名称。但是这个方法有一个问题,因为这个路径下面保存的是临时文件,在我本地手机上测试的时候,第二次调用接口去下载的时候,会进入到moveTo的errorCB回调方法中。于是我只能提示这个文件在第三方应用中打开过。

因为是临时文件,在退出app重新打开的时候,再次下载还是没问题的。

文件的名称最好不要重名,不然会进到moveTo的errorCB回调方法中。 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐