小申申
小申申
  • 发布:2026-08-04 10:33
  • 更新:32 分钟前
  • 阅读:27

华为手机上传图片以外的文件失败,提示权限无法访问,咋解决

分类:uni-app
2026-08-04 10:33 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( 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. 临时调试方案(仅限开发阶段)

如果是 鸿蒙元服务,可开启“开发中元服务豁免管控”:

  • 手机设置 → 系统 → 开发者选项 → 开发中元服务豁免管控 → 开启

参考:元服务网络白名单配置


验证步骤

  1. 使用 uni.chooseMedia 选择文件后,打印 tempFilePath 确认路径有效。
  2. 检查 uni.uploadFilefail 回调,确认是否仍有 permission denied 错误。
  3. 若仍失败,尝试用 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.uploadFilefail 回调内容)以便进一步排查。

内容为 AI 生成,仅供参考
杨杨得亿

杨杨得亿 - 这个人很懒,什么都没有留下~

使用 uni.chooseMedia

// 选择任意文件(非图片)  
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);  
      }  
    });  
  }  
});

要回复问题请先登录注册