HarmonyOS 鸿蒙Next中文件上传报错401

HarmonyOS 鸿蒙Next中文件上传报错401 使用request.uploadFile的api上传文件

应该是fileUri不对,我传入的是internal://files/${this.timeStamp}.mp3,这是在files文件下的,官网上的示例代码是cache缓存路径下的,如果我现在的文件由于某些特别原因就是只能在files文件夹下,应该怎么修改

cke_5756.png

官网上的实例是在cache里面,我把文件放到cache里面,也确实能够跑通,但是一但是在files里面就会报错401


更多关于HarmonyOS 鸿蒙Next中文件上传报错401的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

【解决方案】

关于缓存路径:在文件上传时,文件uri即文件的本地存储路径。仅支持"internal"协议类型,仅支持"internal://cache/",即调用方(即传入的context)对应的缓存路径context.cacheDir。

关于错误码401可以参考官方文档。request.uploadFile不支持上传非缓存目录。

建议在使用request.uploadFile时注意以下几点:

  1. 调用request.uploadFile前使用fs.accessSync检查文件是否存在应用缓存文件路径下。
  2. 检查UploadConfig配置参数中文件的uri是否满足"internal://cache/"的形式。
  3. 若后台服务将接收文件参数设置为"MultipartFile[] file",则不应使用request.uploadFile,可以使用request.agent.create或者三方库[@ohos/axios](https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Faxios)进行多文件上传。

【问题分析】

关于错误码401(the parameters check fails.)的出现的可能原因:

  1. 缺少必需参数。Missing mandatory parameters
  2. 参数类型不正确。Incorrect parameter type
  3. 参数验证失败。Parameter verification failed

更多关于HarmonyOS 鸿蒙Next中文件上传报错401的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可能原因

  1. 路径限制
    request.uploadFile接口仅支持上传**应用缓存目录(cacheDir)**下的文件,对应URI格式为internal://cache/文件名。若尝试使用internal://files/路径,系统会因无法识别路径格式而报错401。

  2. 目录权限差异

    • cacheDir目录(对应internal://cache/)是应用默认允许上传的临时存储区域。
    • files目录(对应internal://files/)通常用于持久化存储,但在此接口中未被支持。

文件上传报错 401 通常表示参数校验失败。

检查必填参数是否完整

request.uploadFile 的核心参数包括:

  • context:必须为 UIAbilityContext,需通过 this.getUIContext().getHostContext() 获取。
  • url:服务器地址需为有效的 HTTP 协议地址(如 http://www.example.com)。
  • method:上传方法通常为 POST。

示例代码

let uploadConfig: request.UploadConfig = {
  url: 'http://www.example.com/upload', // 替换为真实地址
  header: { 'Content-Type': 'multipart/form-data' }, // 根据服务器要求设置
  method: "POST",
  data: [{ name: "file", value: "filePath" }], // 文件路径需正确
};

鸿蒙Next中文件上传返回401状态码表示未授权访问。主要涉及认证凭据缺失或失效。检查应用是否已正确配置文件上传权限,确保在config.json中声明ohos.permission.INTERNET和ohos.permission.WRITE_MEDIA权限。验证请求头是否携带有效的Authorization令牌,若使用OAuth需确认token未过期。服务器端若启用跨域校验,需在请求头包含Origin字段。网络安全管理策略会拦截非法源请求,确保上传域名已加入网络安全白名单。文件大小超限或格式不符也可能触发401拦截。

根据错误信息和代码分析,401错误通常与文件路径权限有关。在HarmonyOS中,internal://files/路径下的文件访问受到更严格的权限控制。

解决方案:

  1. 使用正确的URI方案: 将internal://files/${this.timeStamp}.mp3改为使用FileManager提供的有效URI:
import fileManager from '@ohos.file.fs';

// 获取files目录的合法URI
let fileUri = 'internal://app/files/' + `${this.timeStamp}.mp3`;
  1. 检查文件权限: 确保在module.json5中声明了必要的文件权限:
"requestPermissions": [
  {
    "name": "ohos.permission.READ_MEDIA",
    "reason": "需要读取音频文件"
  }
]
  1. 使用安全的文件路径: 建议将文件存储在cache目录或应用沙箱目录:
// 获取应用文件目录
let context = getContext(this);
let filesDir = context.filesDir;
let filePath = filesDir + `/${this.timeStamp}.mp3`;
  1. 验证文件存在性: 在上传前确认文件可访问:
try {
  let file = await fileManager.access(fileUri);
  // 文件可访问,执行上传
} catch (error) {
  console.error('文件访问失败');
}

files目录相比cache目录有更严格的访问限制,建议优先使用cache目录进行临时文件操作。如果必须使用files目录,请确保路径格式正确且具有相应权限。

回到顶部