前几天开发遇到这个问题,找了半天没找到解决方式,最终看到这篇文章,整理一下,改改标题。希望可以帮助到需要的同志。
问题:在使用微信内置浏览器打开网页时,无法直接使用普通的open方法来打开非网页内容,如apk文件、pdf文件等。即使采取引导用户选择外部浏览器的方式,仍然会有用户不小心点击下载按钮。如何解决这个问题?
解决方式:根据HTTP协议规范,可以通过配置"Content-Disposition"头部字段来实现文件下载。该字段用于描述文件的展现方式。将需要下载的文件定义为附件("attachment"),就会显示下载窗口供用户下载文件。还可以通过指定默认保存的文件名("filename")来提供更好的用户体验。
在微信内打开外部浏览器时,可以遵循以下步骤实现文件下载:
- 首先判断浏览器是否为微信,如果是,则将链接指向一个跳转地址。
- 跳转地址返回附件的头部信息,具体内容可以不必处理。这样能够显示下载界面并让用户选择使用外部浏览器打开。
- 如果解析跳转地址发现浏览器不是微信,直接将用户重定向到目标网页。
- 跳转地址的设计可根据需求进行开发,可以编写一个CGI程序或者使用类似"Content-Disposition"的方式实现。例如,可以使用以下跳转地址:http://www.iot2ai.top/cgi-bin/wxit/open.html,该接口按照以上描述的跳转方式设计。
- 解析User-Agent字段判断是否为微信,如果是,则返回附件的头部描述信息,具体内容是目标网址。如果不是微信,说明用户已选择外部浏览器打开,此时使用301重定向到目标网址即可。
最终代码
1、点击下载触发函数
const dowFile = ({ fileUrl, fileName }) => {
// 微信浏览器跳转默认浏览器进行下载
const userAgent = navigator.userAgent.toLowerCase()
if (userAgent.indexOf('micromessenger') !== -1) {
const url = `http://www.iot2ai.top/cgi-bin/wxit/open.html?${window.location.href}&fileUrl=${fileUrl}&fileName=${fileName}`
alert(url)
window.location.href = url
} else {
dowanloadpdf(fileUrl, fileName)
}
}
2、触发了上面函数,就会在默认浏览器再次打开,当前页面,通过路由参数来判断是否直接下载资源。
onMounted(() => {
let { fileUrl, fileName }: any = route.query
// 存在代表为微信浏览器跳转至此,进行下载
if (fileUrl && fileName) {
dowanloadpdf(fileUrl, fileName)
}
})
重点!!!-------------------------------------------------下面下面
http://www.iot2ai.top/cgi-bin/wxit/open.html?通过作者提供的这个接口来解决跳转默认浏览器,这个地址在PC微信打开会触发默认浏览器打开,用这个地址带我们自己的网页地址,并且把下载的地址带上,我是这样做的。