絡まった数字 2025-04-28 14:01 采纳率: 100%
浏览 18
已结题

上传图片到服务器遇到13400001错误

借鉴你的鸿蒙上传图片到服务器方法遇到13400001,
具体错误是
[request_service_proxy.cpp Create 77] End send create request, failed: 13400001,
[request_manager_impl.cpp Create 74] Request create, seq: 0, failed: 13400001,
[js_task.cpp CreateExec 202] End create task in JsTask CreateExec, seq: 0, failed: 13400001,
[js_task.cpp operator() 157] End task create in AsyncCall output, seq: 0, failed:13400001,
[napi_utils.cpp operator() 633] errorCode: 13400001, errInfo:
文件上传失败: Error: file operation error
我的代码是

export async function uploadAvatar(file: UploadFile) {
  const saveDir = getContext().cacheDir
  const fileParams: request.File[] = []

  try {
    const imageFile = fileIo.openSync(file.uri, fileIo.OpenMode.READ_ONLY)
    // 1. 打开文件(返回File对象)
    const uniqueName = util.generateRandomUUID() + '.jpg'
    // 将相册文件拷贝到沙箱
    fileIo.copyFileSync(imageFile.fd, saveDir + '/' + uniqueName)
    fileParams.push({
      filename: uniqueName, // 文件名称
      name: 'file', // 接口的参数名
      type: 'jpg', // 文件后缀
      uri: `internal://cache/${uniqueName}`// 应该是文件放到cache目录下 如果是cache协议 它会自动找这个文件
    })

    //  发送请求
    return await request.uploadFile(getContext(), {
      method: 'POST',
      url: 'http://10.0.2.2:8080/api/files/upload/avatar',
      header: {
        'Content-Type': 'multipart/form-data',
        'Authorization': `Bearer ${AppStorage.get('token')}`
      },
      files: fileParams,
      data: []
    });

  } catch (err) {
    console.error('文件上传失败:', err);
    throw new Error('文件上传失败: ' + (err instanceof Error ? err.message : String(err)));
  }
}
private async handleUpdate() {
    if (this.isUpdating) return;
    this.isUpdating = true;

    try {
      // 先上传头像(如果有)
      if (this.avatarFile) {
        const uploadFile: UploadFile = {
          uri: this.avatarFile.uri,
          name: this.avatarFile.name,
          type: this.avatarFile.type,
          size: this.avatarFile.size
        };
        const uploadRes = await uploadAvatar(uploadFile);
        uploadRes.on("fail", () => {
          // 上传失败
          AlertDialog.show({
            message: "上传失败"
          })
        })
        uploadRes.on("headerReceive", (headers: object) => {
          // 响应回来的数据
          if (headers["body"]) {
            // 转换为对象形式
            const result = JSON.parse(headers["body"]) as ServiceResponse<string>
            // result.code === 200为成功时的状态码
            if (result.code === 200) {
                this.avatarFile.uri = result.data
            }
          }
        })
      }

  • 写回答

3条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-04-28 14:10
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    根据您提供的错误信息和代码,13400001错误通常与鸿蒙系统的文件操作权限或路径问题有关。以下是解决方案和代码优化建议:

    错误分析

    1. 13400001错误通常表示文件操作失败,可能原因:
      • 文件路径不正确
      • 文件权限不足
      • 文件不存在或无法访问
      • 沙箱目录操作异常

    解决方案

    1. 检查文件路径和权限

    export async function uploadAvatar(file: UploadFile) {
      const context = getContext();
      const saveDir = context.cacheDir;
      
      // 确保目录存在
      try {
        fileIo.mkdirSync(saveDir);
      } catch (err) {
        if (err.code !== 13900015) { // 忽略目录已存在的错误
          console.error('创建目录失败:', err);
          throw err;
        }
      }
    
      const fileParams: request.File[] = [];
      let imageFile: fileIo.File | null = null;
      
      try {
        // 检查源文件是否存在
        if (!fileIo.accessSync(file.uri)) {
          throw new Error('源文件不存在');
        }
    
        imageFile = fileIo.openSync(file.uri, fileIo.OpenMode.READ_ONLY);
        const uniqueName = util.generateRandomUUID() + '.jpg';
        const destPath = saveDir + '/' + uniqueName;
        
        // 复制文件
        fileIo.copyFileSync(imageFile.fd, destPath);
        
        // 检查目标文件是否创建成功
        if (!fileIo.accessSync(destPath)) {
          throw new Error('文件复制失败');
        }
    
        fileParams.push({
          filename: uniqueName,
          name: 'file',
          type: 'image/jpeg', // 修正MIME类型
          uri: `internal://cache/${uniqueName}`
        });
    
        // 发送请求
        return await request.uploadFile(context, {
          method: 'POST',
          url: 'http://10.0.2.2:8080/api/files/upload/avatar',
          header: {
            'Content-Type': 'multipart/form-data',
            'Authorization': `Bearer ${AppStorage.get('token')}`
          },
          files: fileParams,
          data: []
        });
      } catch (err) {
        console.error('文件上传失败:', err);
        throw new Error('文件上传失败: ' + (err instanceof Error ? err.message : String(err)));
      } finally {
        if (imageFile) {
          fileIo.closeSync(imageFile.fd);
        }
      }
    }
    

    2. 关键修改点

    1. 增加了目录存在性检查
    2. 添加了文件访问权限检查
    3. 修正了MIME类型为image/jpeg
    4. 确保文件描述符被正确关闭
    5. 增加了更详细的错误检查

    3. 其他建议

    1. 检查服务器配置:

      • 确保服务器支持multipart/form-data格式
      • 检查服务器端文件大小限制
    2. 网络调试:

      // 在请求中添加进度监听
      const uploadTask = await request.uploadFile(context, {...});
      uploadTask.on('progress', (uploaded, total) => {
      console.log(`上传进度: ${uploaded}/${total}`);
      });
      
    3. 权限检查:
      确保在config.json中有以下权限:

      {
      "module": {
       "reqPermissions": [
         {
           "name": "ohos.permission.INTERNET"
         },
         {
           "name": "ohos.permission.READ_MEDIA"
         },
         {
           "name": "ohos.permission.WRITE_MEDIA"
         }
       ]
      }
      }
      

    如果问题仍然存在,建议:

    1. 使用鸿蒙的hilog打印更详细的日志
    2. 尝试使用绝对路径而非internal://cache
    3. 检查服务器日志查看是否收到请求

    希望这些修改能解决您的问题!如果仍有问题,可以提供更详细的错误日志以便进一步分析。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月6日
  • 已采纳回答 4月28日
  • 创建了问题 4月28日