首页 > 解决方案 > 使用 iframe 在 Nativescript Webview 中上传文件

问题描述

我的问题是我有一个包含动态表单或表单的 webview,它是使用 WP Builders 动态创建的,并且包含在 iframe 中,我想从 nativescript 中的应用程序中选择文件,这将不允许我选择文件。

所以我想试试

如何在本机脚本中将文件加载到 webview

http://shripalsoni.com/blog/nativescript-webview-native-bi-directional-communication/

但问题是表单是动态的,是否有任何脚本可以检测框架内文件输入的点击事件,并且如果我们可以检测到文件输入点击事件,则在选择文件时也会将文件路径放入其中。

另一个问题是如果有多个动态形式的文件输入怎么办

标签: javascriptwebviewnativescript

解决方案


我通过在 android 中实现 WebChromeClient 得到了答案

 let webview: WebView = this.webViewRef.nativeElement;
 let myWebChromeClient: MyWebChromeClient = new MyWebChromeClient();
 webview.android.setWebChromeClient(myWebChromeClient);

MyWebChromeClient 类在这里

import * as imagepicker from "nativescript-imagepicker";
import * as fs from "file-system";

export class MyWebChromeClient extends android.webkit.WebChromeClient {
    file_path:string;
    constructor() {
        super();

        return global.__native(this);
    }

    onShowFileChooser(webView,filePathCallback,fileChooserParams) {

         this.filepathCallback(filePathCallback);

        return true;
    }

    filepathCallback(filePathCallback)
    {
        let context = imagepicker.create({
            mode: "single",
            mediaType: imagepicker.ImagePickerMediaType.Any
        });
       this.startSelection(context,filePathCallback);
    }

    startSelection(context,filePathCallback) {
        context.authorize().then(() => {
                                    return context.present();
                                  })
            .then((selection) => {
                selection.forEach((selected) => {
                    let path = selected.android;
                    let file = fs.File.fromPath(path);
                    this.file_path = file.path;
                    this.file_path = "file://" + this.file_path;
                    let results = Array.create(android.net.Uri, 1);
                    results[0] = android.net.Uri.parse(this.file_path);

                    filePathCallback.onReceiveValue(results);
                    return this.file_path;
                });
            }).catch(function (e) {
                console.log(e);
            });
    }
}

推荐阅读