鸿蒙NEXT使用request模块实现本地文件上传

大家好,我是 V 哥。在鸿蒙 NEXT API 12 中,可以使用 ohos.request 模块提供的上传接口将本地文件上传到服务器。自定义代理设置可以通过 request.agent.create 接口来实现,从而指定代理服务器的地址。下面是一个详细的案例代码,演示了如何使用自定义代理上传本地文件。整理好的学习笔记,分享给大家。

示例代码

typescript 复制代码
import { request } from '@ohos.request';
import { Log } from '@ohos.logger';
import fs from '@ohos.fileSystem';

export default {
  data: {
    localFilePath: '/data/files/example.txt', // 需要上传的文件路径
    serverUrl: 'https://example.com/upload', // 上传文件的服务器URL
    proxyUrl: 'http://proxy.example.com:8080', // 自定义代理地址
  },

  onInit() {
    // 在组件初始化时,触发上传文件的操作
    this.uploadFileWithProxy();
  },

  async uploadFileWithProxy() {
    try {
      // 创建代理代理服务
      const agent = await request.agent.create({
        proxy: this.proxyUrl, // 设置自定义代理地址
      });
      Log.info('Custom proxy agent created successfully.');

      // 读取本地文件
      const fileData = await this.readFile(this.data.localFilePath);
      if (!fileData) {
        Log.error('Failed to read local file.');
        return;
      }

      // 准备上传请求的参数
      const options = {
        url: this.data.serverUrl, // 目标上传URL
        method: 'POST', // HTTP方法为POST
        headers: {
          'Content-Type': 'multipart/form-data', // 设置请求头
        },
        data: {
          file: fileData, // 上传的文件内容
        },
        agent, // 使用代理
      };

      // 发起文件上传请求
      const response = await request.upload(options);
      if (response && response.status === 200) {
        Log.info('File uploaded successfully: ' + JSON.stringify(response));
      } else {
        Log.error('File upload failed: ' + JSON.stringify(response));
      }
    } catch (error) {
      Log.error('Error during file upload: ' + error.message);
    }
  },

  // 读取本地文件内容的函数
  async readFile(filePath: string) {
    try {
      // 读取本地文件
      const fileStats = await fs.stat(filePath);
      if (!fileStats || !fileStats.isFile) {
        return null; // 文件不存在或不是一个文件
      }

      const fileData = await fs.readFile(filePath);
      return fileData;
    } catch (error) {
      Log.error('Error reading file: ' + error.message);
      return null;
    }
  },
};

解释:

  1. 代理服务创建 (request.agent.create)

    • uploadFileWithProxy 函数中,我们使用 request.agent.create 创建了一个自定义代理服务,代理地址由 proxyUrl 提供。
    • 该服务用于通过代理上传文件。
  2. 读取本地文件

    • readFile 函数读取本地文件内容。在这个示例中,我们假设上传的是一个文本文件。
    • 使用 fs.stat 检查文件是否存在,fs.readFile 获取文件内容。
  3. 上传文件

    • 使用 request.upload 发起文件上传请求,并且指定代理。
    • options 中的 url 为目标上传地址,method 为 HTTP 请求方法(在此为 POST)。
    • 上传文件的数据作为 data 部分传递给服务器。
  4. 日志

    • 使用 Log 模块打印上传过程的相关日志信息,帮助调试和监控。

需要注意:

  • request.upload 方法是鸿蒙系统提供的用于上传文件的接口。确保传递正确的 options,包括文件内容、上传URL等。

  • 代理的地址通过 request.agent.create 设置,可以为HTTP请求指定一个中间代理服务器,尤其在网络受限或者有特殊需求时非常有用。

  • 需要正确配置服务器端接收文件的接口(如 POST 方法和表单数据处理)。

  • 将需要上传的文件路径替换为你本地实际存在的文件路径(如 /data/files/example.txt)。

  • 确保服务器端能够处理来自代理服务器的上传请求。

  • 使用合适的 proxyUrl 进行自定义代理。

此示例提供了一个基础框架,你可以根据实际需求扩展或修改功能,感谢支持,关注威哥爱编程,一起学鸿蒙开发。

相关推荐
熊猫钓鱼>_>13 小时前
【SenseNova U1.5 Lite实战】鸿蒙校园工具开发者适配原生统一多模态大模型全记录
人工智能·华为·ai·harmonyos·媒体·sensenova
在人间耕耘13 小时前
鸿蒙7「互动卡片」实测:桌面上多了个“记一笔“按钮 快的很
华为·harmonyos
昇腾知识体系14 小时前
昇腾 AscendC Tiling 设计实战:TilingFunc/TilingData 完整示例与 UB 容量预算
人工智能·华为·知识图谱
RUNIONE14 小时前
合亿RUNIONE 三防平板电脑|手持工业平板 UA810 开源鸿蒙系统,与国产生态深度融合
harmonyos·手持工业平板·手持工业平板厂家
●VON14 小时前
鸿蒙跨平台框架怎么选?从真实需求比较 Flutter、React Native、KMP/CMP 与 Web 路线
flutter·react native·harmonyos
lqj_本人15 小时前
Flutter 三方库「flutter_displaymode」的鸿蒙化适配指南
flutter·华为·harmonyos
邓孟鑫16 小时前
鸿蒙图表MarkerView遮挡解决方案
华为·harmonyos
梦想不只是梦与想16 小时前
鸿蒙 指定设备发布:内部测试
harmonyos·内部测试·指定设备发布
lqj_本人18 小时前
Flutter 三方库「drag_and_drop_flutter」的鸿蒙化适配指南
flutter·华为·harmonyos
JoyCong199818 小时前
知识科普:ToDesk鸿蒙版高级功能免费开放使用了!
运维·服务器·华为·智能手机·harmonyos·远程工作