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出问题了。

相关推荐
普马萨特13 小时前
uni-app x 定位踩坑实录:H5/小程序/App 统一经纬度与逆地理编码
uni-app
Geek_Vison1 天前
保险APP已经用了Flutter,还能接入小程序吗?
flutter·小程序·uni-app·mpaas·小程序容器
郑州光合科技余经理2 天前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
2501_915909063 天前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
不爱说话郭德纲3 天前
从“点点点”到一键出包:我把 uni-app x Android 离线打包做成了脚本
android·前端·uni-app
snotJam3 天前
关于Uniapp的Android自定义基座使用
android·uni-app
今年下半年4 天前
【微信小程序】uni-app + Vue3 + Vite 的小程序项目实现「进入指定范围才能打卡」的考勤功能
微信小程序·uni-app·定位·考勤
郑州光合科技余经理7 天前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
遗憾随她而去.8 天前
uniApp跨端开发: 解决不同平台显示差异问题
uni-app
程序鉴定师12 天前
2026年深圳小程序/App开发公司技术选型指南:从架构设计到交付标准全维度评估
java·小程序·uni-app·php·objective-c