uniapp uni.downloadFile 偶发性下载文件失败 无响应

背景

uniapp开发的安卓app运行时,uni.downloadFile下载文件,偶发性下载失败、没有反应,也不进入complete回调函数,onProgressUpdate也不执行,代码如下

复制代码
var uploadTask = uni.downloadFile({
    url:"",
    success:function(res){
      //输出res.tempFilePath之类的
    },
    fail:function(e){

    },
    complete:function(e){
        //不进入
    }
})

//进度更新
uploadTask.onProgressUpdate((result) => {
    //也不进入
})

同事使用plus api可以成功下载

复制代码
plus.downloader.createDownload(
      url,
      {
        timeout,
        filename: TEMP_PATH + '/download/',
        // 需要与其它平台上的表现保持一致,不走重试的逻辑。
        retry: 0,
        retryInterval: 0,
      },

解决

百度相关帖子,发现有的下载失败是因为url中有特殊字符,而我不属于这种情况,好在这个bug能稳定复现,经观察,

失败时服务器端写入的http Response Header如下

复制代码
Content-Disposition: inline; filename="Some's file name.pdf";

抱着试一试的心态,将filename中特殊字符单引号('),去掉后,成功下载。

后续

带着好奇心,看了下uniapp的源码,

h5版本的源码

复制代码
xhr.onload = function () {
      clearTimeout(timer)
      const statusCode = xhr.status
      const blob = this.response
      let filename
      // 使用 getResponseHeader 跨域时会出现警告,但相比 getAllResponseHeaders 更方便
      const contentDisposition = xhr.getResponseHeader('content-disposition')
      if (contentDisposition) {
        // 暂时仅解析 filename 不解析 filename*
        const res = contentDisposition.match(/filename="?(\S+)"?\b/)
        if (res) {
          filename = res[1]
        }
      }
      blob.name = filename || getFileName(url)
      resolve({
        statusCode,
        tempFilePath: fileToUrl(blob),
      })
}
xhr.onabort = function () {
    clearTimeout(timer)
    reject<Partial<DownloadFileFail>>('abort', { errCode: 600003 })
}
xhr.onerror = function () {
  clearTimeout(timer)
  reject<Partial<DownloadFileFail>>('', { errCode: 602001 })
}

app版本的源码

复制代码
const downloader = plus.downloader.createDownload(
      url,
      {
        timeout,
        filename: TEMP_PATH + '/download/',
        // 需要与其它平台上的表现保持一致,不走重试的逻辑。
        retry: 0,
        retryInterval: 0,
      },
      (download, statusCode) => {
        if (statusCode) {
          resolve({
            tempFilePath: download.filename!,
            statusCode,
          })
        } else {
          reject(`statusCode: ${statusCode}`)
        }
      }
    )

推测

安卓运行,会执行app版本源码?如果是,从app版源码上,看不出来有什么问题,只能推测是上一层uni封装downloadFile时,解析fileName出问题了。

相关推荐
2501_9151063220 小时前
当 Perfdog 开始收费之后,我重新整理了一替代方案
android·ios·小程序·https·uni-app·iphone·webview
2501_915918411 天前
中小团队发布,跨平台 iOS 上架,证书、描述文件创建管理,测试分发一体化方案
android·ios·小程序·https·uni-app·iphone·webview
家里有只小肥猫1 天前
uniApp打包ios报错
ios·uni-app
jingling5551 天前
uniapp | 基于高德地图实现位置选择功能(安卓端)
android·前端·javascript·uni-app
某公司摸鱼前端1 天前
前端一键部署网站至服务器FTP
前端·javascript·uni-app
爱怪笑的小杰杰1 天前
UniApp 桌面应用实现 Android 开机自启动(无原生插件版)
android·java·uni-app
m0_647057961 天前
uniapp使用rich-text流式 Markdown 换行问题与解决方案
前端·javascript·uni-app
木子啊1 天前
Uni-app导航栏适配终极避坑指南
uni-app·自定义导航栏·导航栏
2501_915106321 天前
iOS 如何绕过 ATS 发送请求,iOS调试
android·ios·小程序·https·uni-app·iphone·webview