基于WebDownloadDelegate的PDF下载预览

基于WebDownloadDelegate的PDF下载预览

HarmonyOS
2024-07-23 11:15:15
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
友人FA

首先用到web的网页拦截接口onInterceptRequest判断该pdf是否需要下载浏览。判断的标识是该url的响应头response header中有没有Content-Disposition属性,如“attachment; filename=XXXX.pdf”。

try { 
  if (event) { 
    const webResponse = new WebResourceResponse(); 
    let url = event.request.getRequestUrl() 
    let headers = event.request.getRequestHeader() 
    if(headers['content-disposition']){ 
      AlertDialog.show({ 
        title: '文件下载', cancel: () => { 
          console.log('取消下载'); 
        }, 
        message: '是否下载', confirm: { 
          value: '确认', action: () => { 
            this.setDownloadDelegate() 
            this.controller.startDownload('https://example.com'); 
          } 
        }, 
 
      }) 
    } 
  } 
}

如果需要下载后预览则需要使用startDownload()接口发起一个下载,该下载任务也会通过设置的DownloadDelegate来通知app下载的进度。在此之前,先通过setDownloadDelegate()向Web组件注册一个DownloadDelegate来监听页面触发的下载任务。资源由Web组件来下载,Web组件会通过DownloadDelegate将下载的进度通知给应用。

setDownloadDelegate() { 
  try { 
    this.delegate.onBeforeDownload((webDownloadItem: web_webview.WebDownloadItem) => { 
      console.log('will start a download'); 
      // 传入一个下载路径(沙溪路径),并开始下载。 
      webDownloadItem.start((getContext(this) as common.UIAbilityContext).filesDir + '/test.pdf'); 
    }) 
    // 下载过程中的回调,通过该回调的参数可以了解下载进度等信息。 
    this.delegate.onDownloadUpdated((webDownloadItem: web_webview.WebDownloadItem) => { 
      console.log('download update guid: ' + webDownloadItem.getGuid()); 
    }) 
    // 下载失败的通知。 
    this.delegate.onDownloadFailed((webDownloadItem: web_webview.WebDownloadItem) => { 
      console.log('download failed guid: ' + webDownloadItem.getGuid()); 
    }) 
    // 下载完成的通知。 
    this.delegate.onDownloadFinish(async (webDownloadItem: web_webview.WebDownloadItem) => { 
      console.log('download finish guid: ' + webDownloadItem.getGuid()); 
      let file = fs.statSync((getContext(this) as common.UIAbilityContext).filesDir + '/test.pdf') 
      console.log('testTag - size: ' + file.size + 'path:'); 
    }) 
    let fileuri = 'file://’ + (getContext(this) as common.UIAbilityContext).filesDir + ‘/test.pdf' 
    console.log('testTag - ' + fileuri); 
    this.controller.setDownloadDelegate(this.delegate); 
    web_webview.WebDownloadManager.setDownloadDelegate(this.delegate) 
    this.controller.loadUrl(fileuri) 
  } catch (error) { 
    console.log(JSON.stringify(error)) 
  } 
}

如果不需要下载,则拿到响应头后通过http.createHttp()创建一个任务,然后再调用request根据URL地址,发起HTTP网络请求,在其异步的回调函数里面设置自定义的响应数据。

let httpRequest = http.createHttp(); 
let promise = httpRequest.request(url, { 
  method: http.RequestMethod.GET, 
  connectTimeout: 60000, 
  readTimeout: 60000, 
  header:headers 
}); 
promise.then((data:http.HttpResponse) => { 
  let result = data?.result as ArrayBuffer 
  webResponse.setResponseCode(200); 
  webResponse.setReasonMessage('OK'); 
  webResponse.setResponseData(result); 
  webResponse.setResponseEncoding('UTF_8') 
}).catch((err:Error) => { 
  console.info('error:' + JSON.stringify(err)); 
});
分享
微博
QQ
微信
回复
2024-07-23 18:38:48
相关问题
HarmonyOS PDF 预览问题
162浏览 • 1回复 待解决
PDF预览如何隐藏PDF操作按钮
940浏览 • 1回复 待解决
webview是否支持预览pdf
928浏览 • 1回复 待解决
如何实现pdf文件预览
241浏览 • 1回复 待解决
如何通过web组件预览PDF
469浏览 • 1回复 待解决
HarmonyOS使用Web组件预览PDF和图片
353浏览 • 1回复 待解决
问 鸿蒙JS 怎么实现PDF预览,求教。
7055浏览 • 1回复 已解决
怎么下载网络上PDF保存到本地?
3517浏览 • 1回复 待解决
使用web组件实现预览沙箱中pdf
1796浏览 • 1回复 待解决
鸿蒙支持在线pdf,word这些预览功能么
11335浏览 • 3回复 待解决
怎么使用pdfjs三方库预览pdf文档
1865浏览 • 1回复 待解决
HarmonyOS web组件加载pdf问题
277浏览 • 1回复 待解决
通过loadDocument()接口加载PDF文件
212浏览 • 1回复 待解决
基于RichEditor评论编辑
473浏览 • 1回复 待解决
HarmonyOS filePreview预览txt提示预览失败
221浏览 • 1回复 待解决
HyperlinkonTouch预览报错
1649浏览 • 1回复 待解决
HarmonyOS image和PDF文件互相转换能力
143浏览 • 1回复 待解决