HarmonyOS 鸿蒙Next web从本地documentViewPicker.select选择文件并上传到应用后台

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next web从本地documentViewPicker.select选择文件并上传到应用后台

 1、web中onShowFileSelector处理文件上传操作,通过documentViewPicker.select得到所选文件的uri,直接通过event.result.handleFileList([uri])将uri传给后台,报错open datashare for read file is not valid

2、延续步骤一,将得到的uri进行处理,把文件复制到应用沙箱,关键代码:srcPicFile = fs.openSync(uri, fs.OpenMode.READ_ONLY);此处在通过路径读取文件时报错Operation not permitted

3、在module.json5中授权了READ_MEDIA,WRITE_MEDIA,也做了权限检测。


更多关于HarmonyOS 鸿蒙Next web从本地documentViewPicker.select选择文件并上传到应用后台的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

参考下代码呢

参考下此上传代码,未出现问题: index.ets

import web_webview from '@ohos.web.webview'
import { common } from '@kit.AbilityKit'
import { uri, util } from '@kit.ArkTS'
import fs from '@ohos.file.fs';
import picker from '@ohos.file.picker'
import { BusinessError } from '@kit.BasicServicesKit';
class testClass {
  base64Str: string
  constructor(base64Str: string) {
    this.base64Str = base64Str;
  }
  test(): string {
    return "2123";
  }
  toString(): void {
    console.log('Web Component toString');
  }
}
@Entry
@Component
struct WebComponent {
  controller: web_webview.WebviewController = new web_webview.WebviewController()
  //定义一个全局的string类型的数组,用来存放通过picker拉起后选择完图片后图片的uri
  @State uris: Array<string> = []
  @State base64Str: string = ""
  @State testObj: testClass = new testClass(this.base64Str);
  aboutToAppear() {
    web_webview.WebviewController.setWebDebuggingAccess(true);
  }
  build() {
    Column() {
      Web({ src: $rawfile('TestonShowFileSelector.html'), controller: this.controller })
        .fileAccess(true)
        .javaScriptAccess(true)
        .domStorageAccess(true)
        .onShowFileSelector((event) => {
          // //-------调用相册-------------------------
          /*
                    console.log('MyFileUploader onShowFileSelector invoked')
                    const photoSelectOptions = new picker.PhotoSelectOptions();
                    // 过滤选择媒体文件类型为IMAGE_VIDEO_TYPE
                    photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE;
                    // 选择媒体文件的最大数目
                    photoSelectOptions.maxSelectNumber = 8;
                    //let uris: Array<string> = [];
                    const photoViewPicker = new picker.PhotoViewPicker();
                    photoViewPicker.select(photoSelectOptions).then((photoSelectResult: picker.PhotoSelectResult) => {
                      this.uris = photoSelectResult.photoUris;
                      let file1 = fs.openSync(this.uris[0])
                      let array:ArrayBuffer = new ArrayBuffer(fs.statSync(file1.fd).size)
                      fs.readSync(file1.fd,array)
                      let unit = new Uint8Array(array)
                      let base64 = new util.Base64Helper();
                      let mystr = base64.encodeToStringSync(unit);
                      this.base64Str = "myFunction(\"" + mystr + "\")"
                      this.controller.runJavaScript(this.base64Str)
                      console.info('photoViewPicker.select to file succeed and uris are:' + this.uris);//file://media/Photo/11/IMG_1713942933_005/IMG_20240424_151353.jpg
                    }).catch((err: BusinessError) => {
                      console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
                    })
                    return false
          */
          //----调用文件管理器-----------------
          console.log('MyFileUploader onShowFileSelector invoked')
          const documentSelectOptions = new picker.DocumentSelectOptions();
          // 选择媒体文件的最大数目
          documentSelectOptions.maxSelectNumber = 2;
          const documentViewPicker = new picker.DocumentViewPicker();
          documentViewPicker.select(documentSelectOptions).then((DocumentSelectResult: Array<string>) => {
            this.uris = DocumentSelectResult;
            console.info('photoViewPicker.select to file succeed and uris are:' + this.uris);
          }).catch((err: BusinessError) => {
            console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
          })
          return false
          ////-----相机--------------------------------
          // const context = getContext(this) as common.UIAbilityContext
          // context.startAbilityForResult({
          //   action:"ohos.want.action.imageCapture",
          //   parameters:{
          //     callBundleName:"com.hm.imageshow"
          //   }
          // }).then((res)=>{
          //   console.log("testTag - " +JSON.stringify(res));
          //   let str:string = res.want?.parameters!["resourceUri"] as string
          //   console.log("str"+str);//file://media/Photo/11/IMG_1713942933_005/IMG_20240424_151353.jpg
          //   let fd = fs.openSync(str).fd
          //   this.uris[0] = str
          //   let arr:ArrayBuffer = new ArrayBuffer(128)
          //   fs.readSync(fd,arr)
          //   console.log("testTag - " + str);
          //
          // })
          //return false
        })
    }
  }
}

html

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">
    <script>
    window.onload = function() {
      // 获取文件输入元素
      var fileInput = document.getElementById('upload');
      // 监听文件输入的改变事件
      fileInput.addEventListener('change', function(e) {
        // 获取选中的文件
        var file = e.target.files[0];
        // 创建一个FileReader对象
        var reader = new FileReader();
console.log(file)
        // 定义文件读取完成后的回调函数
        reader.onloadend = function() {
          // 获取图片元素
          var img = document.getElementById('preview');
          // 将读取到的结果赋值给图片元素的src属性
          console.log(reader.result)
          img.src = reader.result;
        }
        // 读取文件内容
        if (file) {
          reader.readAsDataURL(file);
        }
      });
    }
    </script>
</head>
<body>
<form id="upload-form" enctype="multipart/form-data">
    <!-- 修改type属性为camera -->
    <input type="file" id="upload" name="upload"  />
    <!-- 添加一个图片元素用于展示图片 -->
    <img id="preview"/>
</form>
<div id="155134"></div>
</body>
</html>

更多关于HarmonyOS 鸿蒙Next web从本地documentViewPicker.select选择文件并上传到应用后台的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,Next web平台若需从本地documentViewPicker.select选择文件并上传到应用后台,可遵循以下步骤:

  1. 触发文件选择器: 使用documentViewPicker.select方法打开文件选择器,允许用户从本地文件系统中选择文件。确保选择器配置正确,支持所需文件类型。

  2. 获取文件路径: 用户选择文件后,系统会返回所选文件的路径。通过回调函数获取该路径。

  3. 读取文件内容: 利用HarmonyOS的文件系统API,根据获取的文件路径读取文件内容。注意处理文件编码和格式,确保内容读取正确。

  4. 构建上传请求: 将读取的文件内容封装到HTTP请求中,设置请求头(如Content-Type)和必要的请求参数。

  5. 发送上传请求: 通过HarmonyOS的网络API,将构建好的HTTP请求发送到应用后台服务器。确保处理网络异常和响应。

  6. 处理上传结果: 根据服务器返回的响应,处理上传结果。例如,成功时更新UI,失败时显示错误信息。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部