HarmonyOS 鸿蒙Next:使用rcp下载文件时,如何在回调中动态返回downloadProgress
HarmonyOS 鸿蒙Next:使用rcp下载文件时,如何在回调中动态返回downloadProgress
使用rcp下载文件时,如何在回调中动态返回downloadProgress
主要代码如下:
import { rcp } from “@kit.RemoteCommunicationKit”;
import { BusinessError, Callback } from ‘@kit.BasicServicesKit’;
import { LogUtil } from ‘./LogUtil’;
import { FileUtil } from ‘./FileUtil’;
import fs from ‘@ohos.file.fs’;
const BASE_URL: string = “”;
const HTTP_TIMEOUT: number = 10000;
export class RcpResponse {
/** 上传进度 /
static uploadProgress: number = 0;
/* 下载进度 */
static downloadProgress: number = 0;
}
// Define a custom response handler
const customHttpEventsHandler: rcp.HttpEventsHandler = {
onUploadProgress: (totalSize: number, transferredSize: number) => {
// Custom logic for handling upload progress
LogUtil.info("Upload progress: " + transferredSize + " of " + totalSize);
},
onDownloadProgress: (totalSize: number, transferredSize: number) => {
// Custom logic for handling download progress
LogUtil.info("Download progress: " + transferredSize + " of " + totalSize);
RcpResponse.downloadProgress = Math.ceil(transferredSize / totalSize * 100);
},
onDataEnd: () => {
// Custom logic for handling data transfer completion
LogUtil.info(“Data transfer complete”);
},
onCanceled: () => {
// Custom logic for handling cancellation
LogUtil.info(“Request/response canceled”);
},
};
const configuration: rcp.Configuration = {
transfer: {
autoRedirect: true,
timeout: {
// 允许建立连接的最长时间
connectMs: HTTP_TIMEOUT,
// 允许传输数据的最长时间
transferMs: HTTP_TIMEOUT,
}
},
tracing: {
verbose: true,
httpEventsHandler: customHttpEventsHandler,
}
};
const header: rcp.RequestHeaders = {
‘content-type’: ‘application/json’
}
export class HTTPRequestUtil {
/**
- 
下载文件 
- 
@param url: URL 
- 
@param toPath: 文件保存路径 
- 
@returns 通过回调返回
*/
static async downloadFile(url: string, filename: string, progressCallback: (progress: number) => void, succeedCallback: (filepath: string) => void, failedCallback:(err: BusinessError) => void) {
try {
// 获取保存全路径
let finalPath = FileUtil.getFilesDirPath(’’, filename);
let fileDir = FileUtil.getFilesDirPath(’’);
let fn = FileUtil.getFileName(finalPath);
let path = finalPath.replace(fn, “”);
let isExists = fs.accessSync(finalPath); if (isExists) {
fs.unlinkSync(finalPath);
} else {
if (path != fileDir + ‘/’) {
FileUtil.mkdirSync(path, true);
}
} let downloadToFile: rcp.DownloadToFile = {
kind: “file”,
file: finalPath
} as  rcp.DownloadToFile LogUtil.info(“HTTPRequestUtil download file progress: %” + HTTPRequestUtil.downloadProgress); let res = await HTTPRequestUtil.session.downloadToFile(url, downloadToFile); progressCallback(RcpResponse.downloadProgress);
LogUtil.info("Progress: " + RcpResponse.downloadProgress); LogUtil.info("File path: " + finalPath);
succeedCallback(finalPath);
} catch (err) {
LogUtil.error(“HTTPRequestUtil download file error:” + err);
failedCallback(err);
}
} 
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>更多关于HarmonyOS 鸿蒙Next:使用rcp下载文件时,如何在回调中动态返回downloadProgress的实战教程也可以访问 https://www.itying.com/category-93-b0.html
已解决,简单问题复杂化了,以下是完整代码:
/**
   * 下载文件
   * [@param](/user/param) url: URL
   * [@param](/user/param) toPath: 文件保存路径
   *
   * [@returns](/user/returns) 通过回调返回
   */
   async downloadFile(url: string, filename: string, progressCallback: (progress: number) => void, succeedCallback: (filepath: string) => void, failedCallback:(err: BusinessError) => void) {
     // Define a custom response handler
     const customHttpEventsHandler: rcp.HttpEventsHandler = {
       onDownloadProgress: (totalSize: number, transferredSize: number) => {
         // Custom logic for handling download progress
         console.info("Download progress:", transferredSize, "of", totalSize);
         let proc = Math.ceil(transferredSize / totalSize * 100);
         progressCallback(proc);
       }
     };
 <span class="hljs-comment"><span class="hljs-comment">// Configure tracing settings</span></span>
 <span class="hljs-keyword"><span class="hljs-keyword">const</span></span> tracingConfig: rcp.TracingConfiguration = {
   verbose: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
   infoToCollect: {
     textual: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
     incomingHeader: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
     outgoingHeader: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
     incomingData: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
     outgoingData: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
     incomingSslData: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
     outgoingSslData: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
   },
   collectTimeInfo: <span class="hljs-literal"><span class="hljs-literal">true</span></span>,
   httpEventsHandler: customHttpEventsHandler,
 };
 <span class="hljs-comment"><span class="hljs-comment">// Use the configuration in the session creation</span></span>
 <span class="hljs-keyword"><span class="hljs-keyword">const</span></span> session = rcp.createSession({ requestConfiguration: { tracing: tracingConfig } });
 <span class="hljs-keyword"><span class="hljs-keyword">try</span></span> {
  <span class="hljs-comment"><span class="hljs-comment">// 获取保存全路径</span></span>
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> finalPath = FileUtil.getFilesDirPath(<span class="hljs-string"><span class="hljs-string">''</span></span>, filename);
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> fileDir = FileUtil.getFilesDirPath(<span class="hljs-string"><span class="hljs-string">''</span></span>);
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> fn = FileUtil.getFileName(finalPath);
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> path = finalPath.replace(fn, <span class="hljs-string"><span class="hljs-string">""</span></span>);
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> isExists = fs.accessSync(finalPath);
  <span class="hljs-keyword"><span class="hljs-keyword">if</span></span> (isExists) {
    fs.unlinkSync(finalPath);
  } <span class="hljs-keyword"><span class="hljs-keyword">else</span></span> {
    <span class="hljs-keyword"><span class="hljs-keyword">if</span></span> (path != fileDir + <span class="hljs-string"><span class="hljs-string">'/'</span></span>) {
      FileUtil.mkdirSync(path, <span class="hljs-literal"><span class="hljs-literal">true</span></span>);
    }
  }
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> downloadToFile: rcp.DownloadToFile = {
    kind: <span class="hljs-string"><span class="hljs-string">"file"</span></span>,
    file: finalPath
  } as  rcp.DownloadToFile
  await session.downloadToFile(url, downloadToFile);
  LogUtil.info(<span class="hljs-string"><span class="hljs-string">"File path: "</span></span> + finalPath);
  succeedCallback(finalPath);
} <span class="hljs-keyword"><span class="hljs-keyword">catch</span></span> (err) {
  LogUtil.error(<span class="hljs-string"><span class="hljs-string">"HTTPRequestUtil download file error:"</span></span> + err);
  failedCallback(err);
}
}
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>HarmonyOS的分布式技术让我实现了跨设备的无缝协作,工作效率翻倍。
希望HarmonyOS能继续加强在安全性方面的研发,保护用户的隐私和数据安全。
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html
是的,已经拜读了大佬的ef_tool 👍🏻
ef_rcp预计明后天全新轻装上阵,本部分已更换思路提供解决方案,届时欢迎使用并提出宝贵意见
 
        
       
                   
                   
                  


