HarmonyOS 鸿蒙Next 下载文件及根据API导出文件

HarmonyOS 鸿蒙Next 下载文件及根据API导出文件 在项目中我经常会遇到下载文件,我目前遇到两种场景,

1: 根据文件URL下载,2、根据API导出文件

现在就这2中场景我分别实现

根据文件URL下载

使用Harmonyos提供的request.downloadFile下载文件,注意点需要选择文件存储位置,读取沙箱目录里面的文件,通过缓冲流读取公共文件并写入到公共文件。

代码示例:

 public static downloadFile(fileName: string, fileSuffix: string, uploadUrl: string): Promise<boolean> {
    // 获取上下文
    let context = getContext()
    const fileFullName = fileName + '.' + fileSuffix
    // 判定文件是否存在
    if (fs.accessSync(context.filesDir + '/' + fileFullName)) {
      // 删除文件
      fs.unlinkSync(context.filesDir + '/' + fileFullName)
    }
    // 文件存储地址
    const filePath = context.filesDir + '/' + fileFullName;
    try {
      return new Promise((resolve, reject) => {
        // 下载文件
        request.downloadFile(context, { url: uploadUrl,
          filePath: filePath,
          header:{
            'User-Agent':'123'
          },
          enableMetered: true,
          enableRoaming: true }, (err, data) => {
          if (err) {
            console.error('Failed to request the download. Cause: ' + JSON.stringify(err));
            reject(false)
          }
          // 监听文件下载的实时情况 receivedSize已下载 totalSize总大小
          data.on('progress', (receivedSize, totalSize) => {
            console.info("upload totalSize:" + totalSize + "  receivedSize:" + receivedSize);
          })
          // 监听文件下载完成
          data.on('complete', () => {
            console.info('Download task completed.');
            // 打开下载软件位置
            const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例
            documentSaveOptions.newFileNames = [fileFullName]; // 保存文件名(可选)
            const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
            documentViewPicker.save(documentSaveOptions).then((documentSaveResult) => {
              let URI = documentSaveResult[0];
              console.info('documentViewPicker.save to file succeed and URI is:' + URI);
              // 读取沙箱目录里面的文件
              let fileOld = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
              // 文件信息
              let stat = fs.lstatSync(filePath)
              // 缓冲流
              let buf = new ArrayBuffer(stat.size);
              fs.readSync(fileOld.fd, buf);
              fs.fsyncSync(fileOld.fd)
              fs.closeSync(fileOld.fd)
              // 读取公共文件
              let file = fs.openSync(URI, fs.OpenMode.READ_WRITE);
              // 写入公共文件
              let writeLen = fs.writeSync(file.fd, buf);
              console.info('write data to file succeed and size is:' + writeLen);
              fs.closeSync(file);
              resolve(true)
            }).catch((err:BusinessError) => {
              console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
              reject(false)
            })
          })
        });
      })
    } catch (err) {
      console.error('err.code : ' + err.code + ', err.message : ' + err.message);
      return Promise.reject(false);
    }
  }

根据API导出文件,常见代用API导出Excel、Word文件等。

代码示例:


  public static async ExportFile<T>(ExportUrl:string, callback: (result: T) => void) {
    // 获取上下文
    let context = getContext()

    let token=await AppConfig.getToken();
    let Fileheader = {
      "Authentication": token,
      "User-Agent":"123"
    } as Filehearder
    //header['Content-Type']=`----${boundary}`;
    // http请求对象
    let httpRequest = http.createHttp();
    let opt: http.HttpRequestOptions = {
      method: http.RequestMethod.POST,
      header: Fileheader,
      extraData: {},
      expectDataType:http.HttpDataType.ARRAY_BUFFER
    }

    httpRequest.on('headersReceive', (header) => {
      console.info('header: ' + JSON.stringify(header));
      let headerfilename:string="";
      let headerstr=JSON.stringify(header);
      let strarray:Array<string>=headerstr.split(',');
      strarray.forEach(item => {
        if(item.indexOf('content-disposition')>=0){
          let fileArray:Array<string>=item.split('=');
          headerfilename=fileArray[1];

        }

      });


      // 解码文件名
      FileUtil.ExportFileName= decodeURIComponent(headerfilename).replace('"','');

      console.log(  FileUtil.ExportFileName); // 输出解码后的文件名


    });
    // 发送上传请求
    httpRequest.request(ExportUrl, opt)
      .then((resp) => {
        try {
          console.log('................')
          let filePath:string= context.filesDir+'/'+FileUtil.ExportFileName;
          let _file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
          let buffer = resp.result as ArrayBuffer;
          fs.writeSync(_file.fd, buffer);
          console.log('文件下载成功,保存路径:' + filePath);
          let data2:T =true as T
          callback(data2);

          const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例
          documentSaveOptions.newFileNames = [FileUtil.ExportFileName]; // 保存文件名(可选)
          const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
          documentViewPicker.save(documentSaveOptions).then((documentSaveResult) => {
            let URI = documentSaveResult[0];
            console.info('documentViewPicker.save to file succeed and URI is:' + URI);
            // 读取沙箱目录里面的文件
            let fileOld = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
            // 文件信息
            let stat = fs.lstatSync(filePath)
            // 缓冲流
            let buf = new ArrayBuffer(stat.size);
            fs.readSync(fileOld.fd, buf);
            fs.fsyncSync(fileOld.fd)
            fs.closeSync(fileOld.fd)
            // 读取公共文件
            let file = fs.openSync(URI, fs.OpenMode.READ_WRITE);
            // 写入公共文件
            let writeLen = fs.writeSync(file.fd, buf);
            console.info('write data to file succeed and size is:' + writeLen);
            fs.closeSync(file);

          }).catch((err:BusinessError) => {
            console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);

          })

        }
        catch(err) {
          console.info('上传导出失败', JSON.stringify(err))
        }
      })




  }

更多关于HarmonyOS 鸿蒙Next 下载文件及根据API导出文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 下载文件及根据API导出文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,下载文件及根据API导出文件的具体操作如下:

  1. 下载文件

    • 使用DownloadManager类进行文件下载。首先需要获取到DownloadManager的实例,然后创建一个DownloadRequest对象,设置下载文件的URL、保存位置等信息。
    • 调用DownloadManagerenqueue方法,将下载请求加入队列,系统会开始下载文件。
    • 可以通过注册广播接收器或查询下载任务状态来监控下载进度和结果。
  2. 根据API导出文件

    • 导出文件通常涉及读取源文件并写入到目标位置。可以使用FileFileOutputStream类进行文件操作。
    • 如果需要按照特定格式导出,如CSV、JSON等,则需要先解析或构建相应的数据结构,然后逐行写入文件。
    • 确保在导出过程中处理好文件路径、权限和异常处理,避免文件损坏或数据丢失。

请注意,上述操作需要在合适的权限下执行,如读写存储权限。确保在应用中声明并请求这些权限。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部