首页 > 解决方案 > React-Native WebView:问题下载和保存动态生成的文件

问题描述

我们正在打开一个 URL(在 WebView 中),它有一个按钮,可以根据用户选择的过滤器动态生成和下载文件(例如 PDF 或 Excel 或任何其他类型)。这意味着我们没有直接链接到那些可以使用网络请求下载的文件。在chrome中,我们可以看到下载的文件。但是在 WebView 中,我们既看不到下载文件(chrome 在窗口底部显示的方式),也没有任何方法可以拦截/查看静默下载的位置。下面是网页视图:

<WebView
    ref={ref => (webview = ref)}
    originWhitelist={['*']}
    source={{ uri: pageURL }}
    javaScriptEnabled={true}
    startInLoadingState={true}
    scalesPageToFit={true}
    domStorageEnabled={true}
    onError={(err) => console.log(err)}
    onHttpError={(err) => console.log(err)}
    allowFileAccess={true}
    allowFileAccessFromFileURLs={true}
    allowUniversalAccessFromFileURLs={true}
    allowingReadAccessToURL={true}
    mixedContentMode="always"
    onFileDownload={({ nativeEvent }) => {
        const { downloadUrl } = nativeEvent;
        console.log(downloadUrl);
    }}
    onNavigationStateChange={handleWebViewNavigationStateChange}
    onLoad={() => {
        webview.injectJavaScript(jsCode);
    }}
    onMessage={event => {
        const { data } = event.nativeEvent;
    }}
/>

因此,我们有以下查询:

  1. 如何知道 WebView 是否真的下载了文件?
  2. 有没有办法知道 WebView 在哪里下载文件?
  3. 有没有办法指定 WebView 应该下载文件的默认位置?

环境: Expo:40.0.0,React-native:0.63,react-native-webview:11.0.0

当它要求允许在设备上下载和存储文件时,我们点击了“允许”。此外,单击按钮时不会触发 onNavigationStateChange(可能是因为文件在同一页面上下载而没有导航)。我们有 onError 和 onHttpError 不打印任何东西,所以那里似乎没有任何问题。

以下是单击按钮下载文件时执行的代码(C#):

string attachment = "attachment; filename=temp.csv";
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("content-disposition", attachment);
HttpContext.Current.Response.ContentType = "text/csv";
HttpContext.Current.Response.AddHeader("Pragma", "public");
// Prepare file content
HttpContext.Current.Response.Write(fileContent.ToString());
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.Close();

标签: react-nativereact-native-androidreact-native-webview

解决方案


推荐阅读