feat(XWebview): 添加文件下载功能
- 实现了文件下载的逻辑,包括进度显示和错误处理 - 新增了下载文件的UI展示,显示下载进度和状态 - 优化了导入模块,增加了request和common模块的导入 - 修复了一些代码格式问题,优化了代码结构
这个提交包含在:
父节点
049d2601f9
当前提交
7b1ce19c39
@ -3,8 +3,8 @@ import webview from '@ohos.web.webview';
|
|||||||
import { router, WebHeader } from '@kit.ArkUI';
|
import { router, WebHeader } from '@kit.ArkUI';
|
||||||
import { XDialogController } from '../dialog/XDialogController';
|
import { XDialogController } from '../dialog/XDialogController';
|
||||||
import { XDialogList } from '../dialog/XDialogList';
|
import { XDialogList } from '../dialog/XDialogList';
|
||||||
import { picker } from '@kit.CoreFileKit';
|
import { fileUri, picker } from '@kit.CoreFileKit';
|
||||||
import { BusinessError, pasteboard } from '@kit.BasicServicesKit';
|
import { BusinessError, pasteboard, request } from '@kit.BasicServicesKit';
|
||||||
import { ToolsHelper } from '../utils/ToolsHelper';
|
import { ToolsHelper } from '../utils/ToolsHelper';
|
||||||
import { JsParams, XWebController, XWebParams } from '../utils/XWebHelper';
|
import { JsParams, XWebController, XWebParams } from '../utils/XWebHelper';
|
||||||
import { WindowHelper } from '../utils/WindowHelper';
|
import { WindowHelper } from '../utils/WindowHelper';
|
||||||
@ -13,6 +13,8 @@ import { SZYXLocalStorageKeys } from '../utils/SZYXLocalStorageKeys';
|
|||||||
import { XWebManager } from '../utils/XWebManager';
|
import { XWebManager } from '../utils/XWebManager';
|
||||||
import { TitleBarBtn } from '../view/SafeView';
|
import { TitleBarBtn } from '../view/SafeView';
|
||||||
import { GlobalContext } from '../ContextConfig';
|
import { GlobalContext } from '../ContextConfig';
|
||||||
|
import { common } from '@kit.AbilityKit';
|
||||||
|
import { LogHelper } from '../utils/LogHelper';
|
||||||
|
|
||||||
@Entry({ routeName: 'XWebview' })
|
@Entry({ routeName: 'XWebview' })
|
||||||
@Component
|
@Component
|
||||||
@ -37,6 +39,9 @@ export struct XWebview {
|
|||||||
controller: web_webview.WebviewController = new web_webview.WebviewController();
|
controller: web_webview.WebviewController = new web_webview.WebviewController();
|
||||||
dialogController: XDialogController = {} as XDialogController
|
dialogController: XDialogController = {} as XDialogController
|
||||||
ports: webview.WebMessagePort[] = [];
|
ports: webview.WebMessagePort[] = [];
|
||||||
|
@State isDownload: boolean = false
|
||||||
|
@State receivedSize: number = 0
|
||||||
|
@State totalSize: number = 0
|
||||||
|
|
||||||
onRefresh() {
|
onRefresh() {
|
||||||
if (this.refresh_web_base !== -1) {
|
if (this.refresh_web_base !== -1) {
|
||||||
@ -101,8 +106,8 @@ export struct XWebview {
|
|||||||
}
|
}
|
||||||
|
|
||||||
build() {
|
build() {
|
||||||
|
Stack() {
|
||||||
Column() {
|
Column() {
|
||||||
|
|
||||||
Row() {
|
Row() {
|
||||||
Row() {
|
Row() {
|
||||||
Button({ buttonStyle: ButtonStyleMode.TEXTUAL }) {
|
Button({ buttonStyle: ButtonStyleMode.TEXTUAL }) {
|
||||||
@ -232,11 +237,52 @@ export struct XWebview {
|
|||||||
})
|
})
|
||||||
.onDownloadStart((event) => { // 下载文件
|
.onDownloadStart((event) => { // 下载文件
|
||||||
if (event) {
|
if (event) {
|
||||||
console.log('url:' + event.url)
|
this.isDownload = true
|
||||||
console.log('userAgent:' + event.userAgent)
|
let context = getContext(this) as common.UIAbilityContext;
|
||||||
console.log('contentDisposition:' + event.contentDisposition)
|
|
||||||
console.log('contentLength:' + event.contentLength)
|
let filesDir = context.filesDir;
|
||||||
console.log('mimetype:' + event.mimetype)
|
const filePath =
|
||||||
|
`${filesDir}/${ToolsHelper.getUuid()}.${event.mimetype ? event.mimetype.split('/')[1] : ''}`
|
||||||
|
|
||||||
|
try {
|
||||||
|
request.downloadFile(context, {
|
||||||
|
url: event.url,
|
||||||
|
filePath: filePath
|
||||||
|
}).then((downloadTask: request.DownloadTask) => {
|
||||||
|
downloadTask.on('progress', (receivedSize: number, totalSize: number) => {
|
||||||
|
this.receivedSize = receivedSize
|
||||||
|
this.totalSize = totalSize
|
||||||
|
})
|
||||||
|
downloadTask.on('complete', () => {
|
||||||
|
this.isDownload = false
|
||||||
|
LogHelper.info(filePath);
|
||||||
|
GlobalContext.getContext().startAbility({
|
||||||
|
uri: fileUri.getUriFromPath(filePath),
|
||||||
|
type: event.mimetype,
|
||||||
|
flags: 0x00000002
|
||||||
|
})
|
||||||
|
})
|
||||||
|
downloadTask.on('fail', () => {
|
||||||
|
this.isDownload = false
|
||||||
|
ToolsHelper.showMessage('下载失败')
|
||||||
|
})
|
||||||
|
}).catch((err: BusinessError) => {
|
||||||
|
this.isDownload = false
|
||||||
|
LogHelper.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
|
||||||
|
ToolsHelper.showMessage(err.message)
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
this.isDownload = false
|
||||||
|
let err: BusinessError = error as BusinessError;
|
||||||
|
LogHelper.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
|
||||||
|
ToolsHelper.showMessage(err.message)
|
||||||
|
}
|
||||||
|
// ToolsHelper.log("")
|
||||||
|
// ToolsHelper.log('url:' + event.url)
|
||||||
|
// ToolsHelper.log('userAgent:' + event.userAgent)
|
||||||
|
// ToolsHelper.log('contentDisposition:' + event.contentDisposition)
|
||||||
|
// ToolsHelper.log('contentLength:' + event.contentLength)
|
||||||
|
// ToolsHelper.log('mimetype:' + event.mimetype)
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -400,6 +446,24 @@ export struct XWebview {
|
|||||||
top: WindowHelper.topRectHeight,
|
top: WindowHelper.topRectHeight,
|
||||||
bottom: WindowHelper.bottomRectHeight
|
bottom: WindowHelper.bottomRectHeight
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Column() {
|
||||||
|
LoadingProgress()
|
||||||
|
.color(Color.White)
|
||||||
|
.width(80).height(80)
|
||||||
|
Text(`努力下载中(${Math.floor(this.receivedSize / this.totalSize * 100)}%)..`)
|
||||||
|
.fontSize(16)
|
||||||
|
.fontColor(Color.White)
|
||||||
|
}
|
||||||
|
.visibility(this.isDownload ? Visibility.Visible : Visibility.None)
|
||||||
|
.width('100%')
|
||||||
|
.height('100%')
|
||||||
|
.backgroundColor('#40000000')
|
||||||
|
.justifyContent(FlexAlign.Center)
|
||||||
|
}
|
||||||
|
.align(Alignment.Top)
|
||||||
|
.width('100%')
|
||||||
|
.height('100%')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
正在加载...
在新工单中引用
屏蔽一个用户