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
同样问题,请是否有解决办法
更多关于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);
},
});