草庐IT

uniapp图片或文件的预览和下载,兼容ios+安卓+浏览器+企业微信H5

百味风干小肉干 2023-04-15 原文

一、前言

在uniapp的APP日常开发中,我们时常遇到一些兼容性问题,正如本文所提到的图片的预览和下载。在此功能的开发中,我常遇到以下四个问题:

  • 图片预览功能实现,但是PDF,word,xls文件无法打开。
  • 安卓的图片预览和文件查看功能正常,ios系统的手机却问题频出,时不时的无法打开文件。
  • 图片第一次可以打开,第二次就报404,找不到文件。
  • 预览不仅要满足安卓和ios系统,也要使浏览器+企业微信H5也要可以打开文件预览。

二、 图片预览功能实现,但是PDF,word,xls文件无法打开

uni.previewImage()是uniapp的图片预览API,经常与uni.chooseImage()一起使用,不过本文中我们只用到uni.previewImage()即可。注:此API只支持打开图片类型文件。

根据官网文档所说,他只有一个必填参数,那就是urls,也就是图片的路径,因为这个参数是一个数组,我用时,直接把路径放到了一个数组里用,current这个参数是url的索引值,不写就默认是0。

       	// 预览图片
        let url = 'https://www.123.com/'
		uni.previewImage({
            current: 0,
			urls: [url],
			success: function(data) {
					console.log('预览成功');
				},
			fail: function(err) {
					console.log(‘预览失败++err.errMsg);
				}	
		});

三、安卓的图片预览和文件查看功能正常,ios系统的手机却问题频出,时不时的无法打开文件。

uni.downloadFile():把文件下载到本地,返回的是文件下载后的临时路径。必传参数url,string类型。
uni.saveFile(OBJECT):把文件保存到本地。
uni.openDocument():在新页面打开打开文件,支持doc, xls, ppt, pdf, docx, xlsx, pptx格式,常常与文件下载连用。

使用简例如下:

uni.downloadFile({
    url: url,
    success: function(res) {
             var filePath = res.tempFilePath;
             uni.saveFile({
                 tempFilePath:filePath,
                 success:function(res){
                     //保存成功并打开文件
                     uni.openDocument({
                        filePath: filePath,
                        success: (res) => console.log('成功打开文档'),
                        fail:(res)=>{
						uni.showToast({
                            icon:'none',
                            title:'文件打开失败',
                            duration:2000
                        })
                       }
                    })
                 }
             })
        }
});

在此功能是初始版本中,因为我发现此方法jpg,png等图片格式也都可以打开,抱着侥幸心理,我就不管是什么类型,就都用的这一套代码下载预览,后来安卓的图片预览和文件查看功能正常,ios系统的手机却问题频出,时不时的无法打开文件,改了好几个版本,都没从根本上解决问题。

后来我发现,每次打开图片,安卓手机都是直接打开到相册,但是ios的却是在app页面基础上直接打开,我怀疑是ios系统下载缓存机制与安卓不同,才会出现这样的问题,后来想了一套更加完善的方法(在第六章中展现)。

四、图片第一次可以打开,第二次就报404,找不到文件

这个问题好像是因为我们后端的原因,根据后端要求,让我在每次访问图片链接时,后面都拼接上时间戳,保证每次访问的链接结尾都不一样即可解决。

五、预览不仅要满足安卓和ios系统,也要使浏览器也可以打开文件预览

浏览器使用window.open(url,'_blank')即可打开,_blank是规定在新开页面打开文件,_self是在当前页面打开文件。
注:此方法在浏览器可以打开,但是发布到H5时,不一定有效。原以为H5的打开就类似于浏览器的打开方式,因此见浏览器可以打开,便没有测试。最近突然发现,此方法只能用于浏览器。企业微信H5端想要打开的话,则需要用window.location.assign(url);

六、最终版本-兼容安卓、ios、浏览器

下面便是我屡败屡战,实践出来的最终结果,既满足了安卓、ios、浏览器三端的兼容问题,又满足了不管图片还是文件都可以预览的条件。

知识补充:通过使用#ifdef、#endif、#ifdef指示符,我们可以区隔一些特定的代码。

let url = data.url
let type = data.type

//如果是app走这里
//#ifdef APP-PLUS
let times = Date.parse(new Date());//拼接时间戳(根据自己项目需要考虑是否拼接)
uni.downloadFile({
    url: url+'?code='+times,
    success: function(res) {
    var filePath = res.tempFilePath;
    if (type=== 'jpg' || type === 'jpeg' || type === 'png' || type === 'gif' ) {
        //如果是图片走这里
		uni.previewImage({
            current: 0,
            urls: [url],
	})
    }else{
        //如果是文件走这里
		uni.openDocument({
            filePath: filePath,
            success: (res) => console.log('成功打开文档'),
            fail:(res)=>{
                uni.showToast({
                    icon:'none',
                    title:'文件打开失败',
                    duration:2000
                    })
            }
        })
    }
}
});
//#endif
//#ifdef H5
//如果是浏览器走这里
window.open(url,'_blank');
//如果是H5走这里,如果这里没效果,可以把window.open(url,'_blank');注释掉试试
window.location.assign(url);
//#endif

创作不易,可以朝我竖一个大拇指嘛~

有关uniapp图片或文件的预览和下载,兼容ios+安卓+浏览器+企业微信H5的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  4. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  10. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

随机推荐