uni-app 使用uni.downloadFile()方法下载附件时,若附件名包含#等字符且附件为PNG,下载后变为bin文件无法查看

uni-app 使用uni.downloadFile()方法下载附件时,若附件名包含#等字符且附件为PNG,下载后变为bin文件无法查看

开发环境 版本号 项目创建方式
Windows HBuilderX
windows11
HBuilderX 3.8.7
Android Android 12
手机厂商 手机机型
华为 荣耀70 及荣耀手机
页面类型 vue版本
vue vue2

示例代码:

uni.downloadFile({  
    header:header,  
    url: url,  
    success: res => {  
        console.log(res);  
        if(res.statusCode != 200) return  
        uni.showToast({icon:"none",title: '下载成功'});  
        uni.saveFile({  
            tempFilePath: res.tempFilePath,  
            success:(res)=>{  
               fileData.path = res.savedFilePath;  
               console.log(res.savedFilePath);  
            }  
        });  
    }  
});

操作步骤:

正常的下载点击

预期结果:

能正常下载并查看

实际结果:

png等图片无法查看

bug描述:

在使用uni.downloadFile 发现在下载包含#的文件名的png文件的时候,下载后直接将名称切断了,并且无法展示

比如 文件名为 “你好#你好.png” 下载地址为 http://xxxx/esdownload/employee/img/origin/1789834995055525889-你好#你好.png?token=QmVhcmVyIGM3MDc0ZDkyLWM1ZjYtNDYyYi1iMmJmLWRiYjM5ZGZhZjNkNw==

如果不将名称进行编码那么会出现下载不了 所以我将 # 进行了encode 编码 改成了 http://xxxx/esdownload/employee/img/origin/1789834995055525889-你好%23你好.png?token=QmVhcmVyIGM3MDc0ZDkyLWM1ZjYtNDYyYi1iMmJmLWRiYjM5ZGZhZjNkNw==

可以进行下载

但是 打印downloadFile 的success 的res 发现下载下来是这样的 正常的应该不是 1789834995055525889-你好#你好.png 这样吗 结果是这样的: { “tempFilePath”: “_doc/uniapp_temp_1715570209249/download/1789834995055525889-你好.bin”, “statusCode”: 200, “errMsg”: “downloadFile:ok” }

我又将整个url 进行了 encode 编码还是一样,请问这个方法是不允许下载链接有# = 号这些吗? 但是 如果是txt doc 即使下载是上述的 也能打开 只有图片不行

相关的log返回 图片的信息 下载地址 http://xxx/esdownload/employee/img/origin/1789834995055525889-阿斯顿发%23按到.png?token=QmVhcmVyIDU2ZWRjOWExLWNhMzItNDRmYS1iZGMyLTQ3MWJlZWFmZTE0Yw== { “id”: “1789834995055525889-阿斯顿发%23按到.png”, “switcher”: “off”, “showProcess”: true, “process”: 0, “isDownload”: false, “fileName”: “阿斯顿发#按到.png”, “path”: “”, “fldSavePath”: “1789834995055525889-阿斯顿发%23按到.png”, “fldUploadType”: “employee”, “extension”: “png”, “icon”: “Imger”, “iconColor”: “rgb(179, 235, 224)” } 文本的数据信息 下载地址 http://xxx/esdownload/employee/doc/1789852094436016129-阿道夫%23地方.txt?token=QmVhcmVyIDU2ZWRjOWExLWNhMzItNDRmYS1iZGMyLTQ3MWJlZWFmZTE0Yw== { “id”: “1789852094436016129-阿道夫%23地方.txt”, “switcher”: “off”, “showProcess”: true, “process”: 0, “isDownload”: false, “fileName”: “阿道夫#地方.txt”, “path”: “”, “fldSavePath”: “1789852094436016129-阿道夫%23地方.txt”, “fldUploadType”: “employee”, “extension”: “txt”, “icon”: “text”, “iconColor”: “#BDC3C7” } 下载downloadFile 的success 返回的值 { “tempFilePath”: “_doc/uniapp_temp_1715826189626/download/1789834995055525889-阿斯顿发.bin”, “statusCode”: 200, “errMsg”: “downloadFile:ok” } { “tempFilePath”: “_doc/uniapp_temp_1715826189626/download/1789852094436016129-阿道夫.bin”, “statusCode”: 200, “errMsg”: “downloadFile:ok” }

text 能打开 正常的是 下载地址 http://xxxx/esdownload/employee/img/origin/1789836718960607233-111.png?token=QmVhcmVyIDU2ZWRjOWExLWNhMzItNDRmYS1iZGMyLTQ3MWJlZWFmZTE0Yw== { “id”: “1789836718960607233-111.png”, “switcher”: “off”, “showProcess”: false, “process”: 0, “isDownload”: false, “fileName”: “111.png”, “path”: “”, “fldSavePath”: “1789836718960607233-111.png”, “fldUploadType”: “employee”, “extension”: “png”, “icon”: “Imger”, “iconColor”: “rgb(179, 235, 224)” } 下载的log { “tempFilePath”: “_doc/uniapp_temp_1715826189626/download/1789836718960607233-111.png”, “statusCode”: 200, “errMsg”: “downloadFile:ok” }


更多关于uni-app 使用uni.downloadFile()方法下载附件时,若附件名包含#等字符且附件为PNG,下载后变为bin文件无法查看的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

同样问题,请是否有解决办法

更多关于uni-app 使用uni.downloadFile()方法下载附件时,若附件名包含#等字符且附件为PNG,下载后变为bin文件无法查看的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在使用 uni.downloadFile() 方法下载附件时,如果附件名包含特殊字符(如 #)且附件为 PNG 格式,下载后文件变为 .bin 文件无法查看,通常是由于文件名解析或保存路径的问题导致的。以下是一些可能的原因和解决方案:


1. 文件名包含特殊字符

文件名中的特殊字符(如 #?& 等)可能导致文件保存时路径解析错误,从而无法正确保存为 PNG 文件。

解决方案:

在保存文件时,对文件名进行规范化处理,去除或替换特殊字符。例如:

const fileName = "example#file.png"; // 原始文件名
const safeFileName = fileName.replace(/[#?&]/g, "_"); // 替换特殊字符为下划线

uni.downloadFile({
  url: "https://example.com/path/to/file.png", // 文件 URL
  success: (res) => {
    if (res.statusCode === 200) {
      // 保存文件
      uni.saveFile({
        tempFilePath: res.tempFilePath,
        filePath: `${wx.env.USER_DATA_PATH}/${safeFileName}`,
        success: (saveRes) => {
          console.log("文件保存成功:", saveRes.filePath);
        },
        fail: (err) => {
          console.error("文件保存失败:", err);
        },
      });
    }
  },
  fail: (err) => {
    console.error("文件下载失败:", err);
  },
});

2. 文件类型未正确识别

如果下载的文件未正确识别为 PNG 格式,可能会导致文件保存为 .bin 文件。

解决方案:

确保下载的文件类型正确,并在保存时指定正确的文件扩展名。例如:

uni.downloadFile({
  url: "https://example.com/path/to/file.png", // 文件 URL
  success: (res) => {
    if (res.statusCode === 200) {
      // 保存文件时指定扩展名为 .png
      uni.saveFile({
        tempFilePath: res.tempFilePath,
        filePath: `${wx.env.USER_DATA_PATH}/file.png`, // 确保扩展名为 .png
        success: (saveRes) => {
          console.log("文件保存成功:", saveRes.filePath);
        },
        fail: (err) => {
          console.error("文件保存失败:", err);
        },
      });
    }
  },
  fail: (err) => {
    console.error("文件下载失败:", err);
  },
});

3. 临时文件路径问题

uni.downloadFile() 下载的文件会保存为临时文件,如果未正确处理临时文件路径,可能会导致文件保存失败或保存为 .bin 文件。

解决方案:

确保使用 res.tempFilePath 作为保存文件的源路径,并正确保存到目标路径。例如:

uni.downloadFile({
  url: "https://example.com/path/to/file.png", // 文件 URL
  success: (res) => {
    if (res.statusCode === 200) {
      // 保存临时文件
      uni.saveFile({
        tempFilePath: res.tempFilePath,
        filePath: `${wx.env.USER_DATA_PATH}/file.png`,
        success: (saveRes) => {
          console.log("文件保存成功:", saveRes.filePath);
        },
        fail: (err) => {
          console.error("文件保存失败:", err);
        },
      });
    }
  },
  fail: (err) => {
    console.error("文件下载失败:", err);
  },
});

4. 检查文件 MIME 类型

如果服务器未正确设置文件的 MIME 类型(如 image/png),可能会导致文件类型识别错误。

解决方案:

在下载文件后,检查文件的 MIME 类型,并根据类型手动设置文件扩展名。例如:

uni.downloadFile({
  url: "https://example.com/path/to/file.png", // 文件 URL
  success: (res) => {
    if (res.statusCode === 200) {
      // 获取文件类型
      uni.getFileInfo({
        filePath: res.tempFilePath,
        success: (infoRes) => {
          const mimeType = infoRes.mimeType; // 获取 MIME 类型
          let extension = ".png"; // 默认扩展名
          if (mimeType === "image/png") {
            extension = ".png";
          } else if (mimeType === "image/jpeg") {
            extension = ".jpg";
          }
          // 保存文件
          uni.saveFile({
            tempFilePath: res.tempFilePath,
            filePath: `${wx.env.USER_DATA_PATH}/file${extension}`,
            success: (saveRes) => {
              console.log("文件保存成功:", saveRes.filePath);
            },
            fail: (err) => {
              console.error("文件保存失败:", err);
            },
          });
        },
      });
    }
  },
  fail: (err) => {
    console.error("文件下载失败:", err);
  },
});
回到顶部