uni-app 通过 uni.downloadFile 下载中文名的 pdf 文件返回乱码

uni-app 通过 uni.downloadFile 下载中文名的 pdf 文件返回乱码

27 回复

下载地址发一下

更多关于uni-app 通过 uni.downloadFile 下载中文名的 pdf 文件返回乱码的实战教程也可以访问 https://www.itying.com/category-93-b0.html


回复 吴web: token

回复 DCloud_iOS_WZT: token指的是?

回复 吴web: {“code”:“40310013”,“msg”:“invalid user token.”}

回复 DCloud_iOS_WZT: loginToken: 7dd997cb88f89f02133f7bcbcb43a5d56ac4944994aa9521

回复 吴web: 在header里? 要不你发一个完整的示例代码在附件里

这个链接是有时效性的6分钟

回复 吴web: 这。。我不太好测啊,这个大概率是你们服务的文件编码格式问题导致的,下载返回的什么名字就显示什么名字

回复 DCloud_iOS_WZT: 主要是安卓不会,ios才会有这种问题。而且我是通过uni.downloadFile这api来下载的后台返回的链接

回复 吴web: 能提供一个稳定测试的链接么

回复 DCloud_iOS_WZT: 因为这块的路径是通过又拍云平台返回的链接,时间这款我这边控制不了

回复 吴web: 用的哪个版本hx

回复 DCloud_iOS_WZT: 3.1.22.20210709

回复 吴web: 更新到最新的正式版试一下

回复 DCloud_iOS_WZT: 升级到最新版还是不行

回复 吴web: 除了文件名的问题,文件本身能打开么

回复 DCloud_iOS_WZT: 可以打开

回复 吴web: 用楼下的方法试一下,下载前地址urlencode下

回复 DCloud_iOS_WZT: 不行哟

用h5plus的api去下载 可以指定文件名 https://www.html5plus.org/doc/zh_cn/downloader.html

之前试过这个api方法,还一样返回乱码

回复 吴web: 进行解码就行了

回复 Absorbed66c:返回:“_测试.txt” 格式,转换没有

uni.downloadFile({
url: “https://file.vip.imocq.com/000-a48798ad-1551-4a90-93aa-df7a5b948407/20210820/1629430314065_测试.txt?_upt=acd0d7c31629444243&_upd=1629430314065_测试.txt”,//下载地址接口返回
success: (data) => {
if (data.statusCode === 200) {
//文件保存到本地
var file = data.tempFilePath
uni.saveFile({
tempFilePath: data.tempFilePath, //临时路径
success: function(res) {
plus.nativeUI.closeWaiting();
setTimeout(() => {
//打开文档查看
uni.openDocument({
filePath: res.savedFilePath,
success: function(res) {
// console.log(‘打开文档成功’);
}
});
}, 1000)
},fail(err){
console.log(err,‘错误的回掉************’)
}
});
}
},
fail: (err) => {
console.log(err);
uni.showToast({
icon: ‘none’,
mask: true,
title: ‘失败请重新下载’,
});
},
});

问题分析:
uni.downloadFile 下载中文文件名文件时出现乱码,通常是因为服务器返回的 Content-Disposition 响应头未正确编码,或前端未处理编码导致的。常见场景如下:

  1. 服务器响应头中的 filename 未使用 UTF-8 编码(如直接传递中文)。
  2. iOS/Android 系统对文件名解码方式不一致。

解决方案:

  1. 检查服务器响应头
    确保服务器返回的 Content-Disposition 头使用 UTF-8 编码,例如:

    Content-Disposition: attachment; filename*=UTF-8''%E4%B8%AD%E6%96%87.pdf
    

    或至少进行 URL 编码:

    Content-Disposition: attachment; filename="%E4%B8%AD%E6%96%87.pdf"
    
  2. 前端手动处理文件名(兼容方案)
    如果服务器无法修改,可在下载成功后通过 uni.saveFile 保存时重命名文件:

    uni.downloadFile({
      url: 'https://example.com/文件.pdf',
      success: (res) => {
        if (res.statusCode === 200) {
          // 指定正确的中文文件名
          uni.saveFile({
            tempFilePath: res.tempFilePath,
            filePath: `${uni.env.USER_DATA_PATH}/中文文件.pdf`,
            success: (saveRes) => {
              console.log('文件保存路径:', saveRes.savedFilePath);
            }
          });
        }
      }
    });
    
  3. 使用 Base64 或 Blob 处理(H5 端)
    在 H5 环境中,可通过 axiosfetch 获取文件流后,用 <a> 标签下载:

    // 示例:H5 端通过 Blob 下载
    fetch(url).then(res => res.blob()).then(blob => {
      const link = document.createElement('a');
      link.href = URL.createObjectURL(blob);
      link.download = '中文文件.pdf';
      link.click();
    });
回到顶部