HarmonyOS 使用ArkWeb下载文件时,保存文件失败

使用ArkWeb下载文件时,下载代理提示已下载完成,并且有实际下载内容,但是保存文件时空。代码如下:

//首先注册一个下载代理
this.delegate.onBeforeDownload((webDownloadItem: web_webview.WebDownloadItem) => {
  console.log("EntryAbility: will start a download.");

  //然后唤起系统文件框
  const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例
  documentSaveOptions.newFileNames =
    ["摩羯星GPS轨迹导出_" + (new Date()).getTime() + ".txt"]; // 保存文件名(可选)
  documentSaveOptions.fileSuffixChoices = ['.txt']; // 保存文件类型(可选)

  let uris: Array<string> = [];
  let documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
  documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
    uris = documentSaveResult;

    // 传入一个下载路径,并开始下载。
    // 如果传入一个不存在的路径,则会下载到默认/data/storage/el2/base/cache/web/目录。
    //webDownloadItem.start("/data/storage/el2/base/cache/web/" + webDownloadItem.getSuggestedFileName());
    //保存到文件框提示的下载位置
    webDownloadItem.start(uris.toString());
  }).catch((err: BusinessError) => {
    console.error(`EntryAbility: Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
  })
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
HarmonyOS
2024-12-25 16:08:41
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
FengTianYa

请参考以下demo:

import web_webview from '@ohos.web.webview'
import business_error, { BusinessError } from '@ohos.base'
import { picker } from '@kit.CoreFileKit';
import fileUri from "@ohos.file.fileuri";

@Entry
@Component
struct WebComponent {
  controller: web_webview.WebviewController = new web_webview.WebviewController();
  delegate: web_webview.WebDownloadDelegate = new web_webview.WebDownloadDelegate();

  build() {
    Column() {
      Button('setDownloadDelegate')
        .onClick(() => {
          try {
            this.delegate.onBeforeDownload((webDownloadItem: web_webview.WebDownloadItem) => {
              console.log("EntryAbility: will start a download.");

              const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例
              // documentSaveOptions.newFileNames =
              // ["摩羯星GPS轨迹导出_" + (new Date()).getTime() + ".txt"]; // 保存文件名(可选)
              // documentSaveOptions.fileSuffixChoices = ['.txt']; // 保存文件类型(可选)
              documentSaveOptions.pickerMode=1
              let uris: Array<string> = [];
              let documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
              documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
                uris = documentSaveResult;
                if (0 == uris.length) {
                  return;
                }
                console.info('EntryAbility: documentViewPicker.save to file succeed and uris are:' + uris);

                /*let file = fs.openSync(uris.toString(), fs.OpenMode.READ_WRITE);
                let writeLen: number = fs.writeSync(file.fd, 'hello, world');
                console.info('write data to file succeed and size is:' + writeLen);
                fs.closeSync(file);*/

                // 传入一个下载路径,并开始下载。
                // 如果传入一个不存在的路径,则会下载到默认/data/storage/el2/base/cache/web/目录。
                // webDownloadItem.start("/data/storage/el2/base/cache/web/" +'1721361956535.txt');
                const uriString = documentSaveResult[0];
                if (!uriString) {
                  return;
                }
                const uri = new fileUri.FileUri(uriString);
                webDownloadItem.start(uri.path+'/摩羯星GPS轨迹导出_'+(new Date()).getTime() + '.txt');
                console.info('EntryAbility: download to ' + uri.path);
              }).catch((err: BusinessError) => {
                console.error(`EntryAbility: Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
              })
            })
            this.delegate.onDownloadUpdated((webDownloadItem: web_webview.WebDownloadItem) => {
              // 下载任务的唯一标识。
              console.log("EntryAbility: download update guid: " + webDownloadItem.getGuid());
              // 下载的进度。
              console.log("EntryAbility: download update PercentComplete: " +
              webDownloadItem.getPercentComplete());
              // 当前的下载速度。
              console.log("EntryAbility: download update speed: " + webDownloadItem.getCurrentSpeed())
            })
            this.delegate.onDownloadFailed((webDownloadItem: web_webview.WebDownloadItem) => {
              console.log("EntryAbility: download failed guid: " + webDownloadItem.getGuid());
              console.log("EntryAbility: download failed LastErrorCode: " +
              webDownloadItem.getLastErrorCode());
            })
            this.delegate.onDownloadFinish((webDownloadItem: web_webview.WebDownloadItem) => {
              console.log("EntryAbility: download finish guid: " + webDownloadItem.getGuid());
            })
            this.controller.setDownloadDelegate(this.delegate);
          } catch (error) {
            let e: business_error.BusinessError = error as business_error.BusinessError;
            console.error(`ErrorCode: ${e.code}, Message: "EntryAbility download error: " + ${e.message}`);
          }
        })
      Button('startDownload')
        .onClick(() => {
          try {
            // 这里指定下载地址为xxxxx,Web组件会发起一个下载任务将该页面下载下来。
            // 开发者需要替换为自己想要下载的内容的地址。
            this.controller.startDownload('https://www.huawei.com');
          } catch (error) {
            let e:business_error.BusinessError = error as business_error.BusinessError;
            console.error(`ErrorCode: ${e.code}, EntryAbility: Message: ${e.message}`);
          }
        })
      Web({ src: 'www.huawei.com', controller: this.controller }).height('100%').width('100%')
    }
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
分享
微博
QQ
微信
回复
2024-12-25 17:12:59


相关问题
HarmonyOS下载文件失败返回
1388浏览 • 1回复 待解决
HarmonyOS 下载文件保存到指定目录
1166浏览 • 1回复 待解决
如何使用接口下载文件
2878浏览 • 1回复 待解决
HarmonyOS 使用http下载文件异常
1052浏览 • 1回复 待解决
使用request下载文件的方式
1661浏览 • 1回复 待解决
HarmonyOS下载文件报错
1342浏览 • 1回复 待解决
request下载文件不能覆盖现有文件
2607浏览 • 1回复 待解决
如何查看HarmonyOS下载文件
1111浏览 • 1回复 待解决
HarmonyOS axios下载文件问题
975浏览 • 1回复 待解决
是否支持iframe下载文件
1512浏览 • 1回复 待解决
HarmonyOS 如何下载文件到本地
853浏览 • 1回复 待解决
HarmonyOS 下载文件到指定文件
977浏览 • 1回复 待解决
HarmonyOS 下载文件相关的demo
652浏览 • 1回复 待解决
下载文件打印乱码如何修改
1150浏览 • 1回复 待解决
HarmonyOS web下载文件点击无反应
1000浏览 • 1回复 待解决
HarmonyOS 文件下载保存问题
1375浏览 • 1回复 待解决
HarmonyOS 如何监听下载文件的进度
994浏览 • 1回复 待解决
HarmonyOS http请求下载文件报错2300023
985浏览 • 1回复 待解决
http请求中下载文件报错2300023
3572浏览 • 1回复 待解决
HarmonyOS 下载文件到内部存储报错:401
1025浏览 • 1回复 待解决