#跟着若城学鸿蒙# web篇-文件选择

前言

前端业务中经常遇到需要使用手机上文件的情况,比如更换头像,上传记录等。我们来看下在鸿蒙上如何实现。

web组件

当我们不做任何处理的时候,web组件会提供默认行为来处理前端页面文件上传的请求。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebCamera</title>
</head>
<body>
<input type="file" name="photo" id="photo"><br>
<img style="display: none;width:200px;" id="img">
<script>
    let photo = document.getElementById("photo");
    photo.addEventListener("change", preViewImg)
    function preViewImg(event) {
        let fileReader = new FileReader();
        let img = document.getElementById("img");
        fileReader.addEventListener(
            "load",
            () => {
                // 将图像文件转换为 Base64 字符串
                img.src = fileReader.result;
            },
            false,
        );
        fileReader.readAsDataURL(event.target.files[0]);
        img.style.display = "block";
    }
</script>
</body>
</html>

在web组件上,我们可以获取对应的参数

            //文件选择  用于通知Web组件文件选择的结果。
            // 返回值boolean。当返回值为true时,用户可以调用系统提供的弹窗能力。当返回值为false时,函数中绘制的自定义弹窗无效。
          .onShowFileSelector((event) => {
            let title = event.fileSelector.getTitle()
            let mode = event.fileSelector.getMode()
            let types: string[] = event.fileSelector.getAcceptType()
            let isCapture = event.fileSelector.isCapture()
            console.error(`title:${title} ,mode:${mode} ,types:${types} ,isCapture:${isCapture} `)
            return false;
          })

效果图

img

获取到的参数: title:open file ,mode:0 ,types: ,isCapture:false

限定类型

当我们在前端页面上限定类型之后:

<input type="file" name="photo" accept="image/*" id="photo"><br>

在鸿蒙上还是不做处理的时候

img


由于前端只接收图片类型,这里我们可以在鸿蒙侧看到传入的参数 title:open file ,mode:0 ,types:.tif,.pjp,.jfif,.bmp,.webp,.svg,.gif,.svgz,.jpg,.hevc,.jpeg,.pjpeg,.png,.ico,.avif,.apng,.heic,.xbm,.tiff,.heif ,isCapture:false
同时弹出使用哪个应用来相应的选择框。即使我们选择了文件,打开之后也是只能选择图片类型,其他类型的文件是灰色不可选中状态

img

自定义选择

当然我们也可以自己控制,在web组件的onShowFileSelector方法中返回true,表示我们自己处理这个事件,不需要系统默认响应
在web组件中

          .onShowFileSelector((event) => {
            let title = event.fileSelector.getTitle()
            let mode = event.fileSelector.getMode()
            let types: string[] = event.fileSelector.getAcceptType()
            let isCapture = event.fileSelector.isCapture()
            console.error(`title:${title} ,mode:${mode} ,types:${types} ,isCapture:${isCapture} `)
            this.selectFile(event.result);
            return true;
          })

  async selectFile(result: FileSelectorResult): Promise<void> {
    let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    let photoPicker = new photoAccessHelper.PhotoViewPicker();
    // 过滤选择媒体文件类型为IMAGE
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE;
    // 设置最大选择数量
    photoSelectOptions.maxSelectNumber = 5;
    let chooseFile: picker.PhotoSelectResult = await photoPicker.select(photoSelectOptions);
    // 获取选择的文件列表
    result.handleFileList(chooseFile.photoUris);
  }

这样我们就可以使用我们自定义选择器来响应前端的文件选择事件了。
当然这里是假设选择的是图片和视频,实际开发中我们可以根据getAcceptType()方法的返回值来判断使用哪种选择器

效果图

img


以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值