欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
问题根因
华为手机(尤其是鸿蒙系统或 Android 10+)上传非图片文件失败,通常是因为 Android 分区存储(Scoped Storage)限制 或 未正确申请存储权限。uni.chooseFile 在 Android 高版本上需要 READ_EXTERNAL_STORAGE 权限,而华为对权限管控更严格。
解决方案(按优先级排序)
1. 使用 uni.chooseMedia 替代(推荐)
根据 DCloud 官方说明,Android 的 uni.chooseMedia 已采用 Picker 模式,无需申请存储权限即可选择文件(包括图片、视频、文档等),完美绕开华为权限限制。
// 选择任意文件(非图片)
uni.chooseMedia({
count: 1,
mediaType: ['mix'], // 或 ['video', 'image'] 根据需求
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePath = res.tempFiles[0].tempFilePath;
// 使用 uni.uploadFile 上传
uni.uploadFile({
url: 'YOUR_UPLOAD_URL',
filePath: tempFilePath,
name: 'file',
success: (uploadRes) => {
console.log('上传成功', uploadRes);
},
fail: (err) => {
console.error('上传失败', err);
}
});
}
});
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
注意:uni.chooseMedia 在 HBuilderX 3.6.5+ 支持,且华为机型兼容性更好。
2. 若必须使用 uni.chooseFile,需手动申请权限
在 manifest.json 中声明权限,并在代码中动态申请:
// #ifdef APP-PLUS
plus.android.requestPermissions(
['android.permission.READ_EXTERNAL_STORAGE'],
(result) => {
if (result.granted.length > 0) {
// 权限已获取,再调用 uni.chooseFile
uni.chooseFile({
count: 1,
extension: ['.pdf', '.doc', '.docx'], // 指定文件类型
success: (res) => {
// 上传逻辑
}
});
} else {
uni.showToast({ title: '请授权存储权限', icon: 'none' });
}
},
(error) => {
console.error('权限申请失败', error);
}
);
// #endif
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
3. 鸿蒙系统(HarmonyOS)特殊处理
如果是 鸿蒙 App(非 Android),需检查 module.json5 是否声明权限:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.READ_MEDIA",
"reason": "$string:reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
}
}
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
参考:鸿蒙权限配置
4. 临时调试方案(仅限开发阶段)
如果是 鸿蒙元服务,可开启“开发中元服务豁免管控”:
- 手机设置 → 系统 → 开发者选项 → 开发中元服务豁免管控 → 开启
参考:元服务网络白名单配置
验证步骤
- 使用
uni.chooseMedia 选择文件后,打印 tempFilePath 确认路径有效。
- 检查
uni.uploadFile 的 fail 回调,确认是否仍有 permission denied 错误。
- 若仍失败,尝试用
plus.io.resolveLocalFileSystemURL 检查文件是否存在:
plus.io.resolveLocalFileSystemURL(tempFilePath, (entry) => {
console.log('文件存在', entry);
}, (err) => {
console.error('文件不存在', err);
});
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
总结
| 方案 |
适用场景 |
优点 |
缺点 |
uni.chooseMedia |
所有文件类型 |
无需权限,华为兼容性好 |
需 HBuilderX 3.6.5+ |
uni.chooseFile + 动态权限 |
旧项目兼容 |
灵活指定文件类型 |
需处理权限弹窗 |
鸿蒙 module.json5 配置 |
鸿蒙 App |
官方标准方案 |
仅限鸿蒙 |
推荐优先使用 uni.chooseMedia,若仍有问题,请提供具体错误日志(uni.uploadFile 的 fail 回调内容)以便进一步排查。
2 个回复
Ask小助手
问题根因
华为手机(尤其是鸿蒙系统或 Android 10+)上传非图片文件失败,通常是因为 Android 分区存储(Scoped Storage)限制 或 未正确申请存储权限。
uni.chooseFile在 Android 高版本上需要READ_EXTERNAL_STORAGE权限,而华为对权限管控更严格。解决方案(按优先级排序)
1. 使用
uni.chooseMedia替代(推荐)根据 DCloud 官方说明,Android 的
uni.chooseMedia已采用 Picker 模式,无需申请存储权限即可选择文件(包括图片、视频、文档等),完美绕开华为权限限制。2. 若必须使用
uni.chooseFile,需手动申请权限在
manifest.json中声明权限,并在代码中动态申请:3. 鸿蒙系统(HarmonyOS)特殊处理
如果是 鸿蒙 App(非 Android),需检查
module.json5是否声明权限:4. 临时调试方案(仅限开发阶段)
如果是 鸿蒙元服务,可开启“开发中元服务豁免管控”:
验证步骤
uni.chooseMedia选择文件后,打印tempFilePath确认路径有效。uni.uploadFile的fail回调,确认是否仍有permission denied错误。plus.io.resolveLocalFileSystemURL检查文件是否存在:总结
uni.chooseMediauni.chooseFile+ 动态权限module.json5配置推荐优先使用
uni.chooseMedia,若仍有问题,请提供具体错误日志(uni.uploadFile的fail回调内容)以便进一步排查。杨杨得亿 - 这个人很懒,什么都没有留下~
使用 uni.chooseMedia
要回复问题请先登录或注册
公告
更多>相关问题