V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
x77
V2EX  ›  程序员

Flutter Web App 将内存中的数据存储为文件(下载数据)方案?

  •  
  •   x77 · 2023-06-19 14:49:56 +08:00 · 1296 次点击
    这是一个创建于 524 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:数据可以直接下载到默认路径,目标是需要浏览器弹出下载对话框让用户选择下载路径。为内存中的数据生成的 url 是这样的:blob:http(s)://.......

    1 ,数据在 app 即浏览器中。app 向服务器发 post 请求,服务器回应一段数据就完事了,别问为什么不从服务器下载,因为服务器也没提供下载链接

    2 ,dart:html 尝试 window.open(url, '_blank', 'saveAs=true'); 等做法无效,浏览器会打开这个 url ,而不会弹出下载对话框

    3 ,dart:js 尝试将下载功能放到 JavaScript 中然后 dart 调用 JavaScript 函数,做法无效,浏览器依然打开这个 url ,而不会弹出下载对话框

    4 ,使用 HtmlElementView ,为 url 构造 html 页面如 <a href=$url.....,左键点击浏览器依然是打开,需要右键点击才可以触发浏览器的下载动作。

    5 ,其他方案?

    13 条回复    2023-06-19 19:06:59 +08:00
    xiangyuecn
        1
    xiangyuecn  
       2023-06-19 15:09:40 +08:00
    <a href="" download="文件名"
    okakuyang
        2
    okakuyang  
       2023-06-19 15:14:58 +08:00 via iPhone
    用 a 标签触发下载
    x77
        3
    x77  
    OP
       2023-06-19 15:17:32 +08:00
    @xiangyuecn
    @okakuyang

    点击可以下载,但是浏览器没有弹出下载对话框,直接下载到默认目录去了。右键另存为可以弹出下载对话框并且正常下载,但是要多个操作。希望(左键)点击 <a> 可以让浏览器弹出下载对话框
    okakuyang
        4
    okakuyang  
       2023-06-19 15:19:26 +08:00 via iPhone
    @x77 你没给 a 标签加 download 属性吧 加了能触发下载框的
    x77
        5
    x77  
    OP
       2023-06-19 15:42:07 +08:00
    @okakuyang

    没加,不弹对话框直接下载。
    加了,不弹对话框直接下载。`<a download='1.dat' href=$url>download</a>`

    不管加没加,右键->save as 都有对话框
    okakuyang
        6
    okakuyang  
       2023-06-19 16:14:56 +08:00 via iPhone
    @x77 理解你的需求了,我首先能想到的是用 filesystem 的 api 可以打开一个保存对话框,但是这个只有在高版本 chrome 上才有支持。我搜索一下有没有其他方案。
    xiangyuecn
        7
    xiangyuecn  
       2023-06-19 16:22:37 +08:00
    chrome 设置 -> 下载内容 -> 勾选 “下载前询问每个文件的保存位置”

    感觉你应该试试 IE ,完全符合你的要求🐶 下载到哪里,完全是浏览器任性,chrome 的默认下载位置确实傻缺。
    okakuyang
        8
    okakuyang  
       2023-06-19 16:24:26 +08:00 via iPhone
    @x77 看了一圈 ,似乎都是用 filesystem 的 showsavefilepicker()这个办法。如果只考虑 chrome 可以试试。
    mxT52CRuqR6o5
        9
    mxT52CRuqR6o5  
       2023-06-19 16:36:06 +08:00
    下载文件具体是弹窗还是直接下载是浏览器行为,js 控制不了的
    要么就像上面几层说的用 filesystem 的 api
    x77
        10
    x77  
    OP
       2023-06-19 16:38:01 +08:00
    @xiangyuecn
    每次下载都询问,勾了
    x77
        11
    x77  
    OP
       2023-06-19 16:44:05 +08:00
    @okakuyang
    @mxT52CRuqR6o5

    没辙我就不跟浏览器刚了,随它直接下载去吧。
    kingofzihua
        12
    kingofzihua  
       2023-06-19 16:46:34 +08:00
    x77
        13
    x77  
    OP
       2023-06-19 19:06:59 +08:00
    @kingofzihua

    用过 FileSaver.js ,用 Dart 调用它 JS 的函数,也用过其他监听 Click 的 JS 方案。同样的代码放到 HTML 页面里可以弹框下载,放到 Flutter Web App 就变成不弹框直接下载。

    不刚了,估计和 Flutter Web 的环境关系不大,可能和 Blob 链接有关系或是 Bug ,Blob 链接不受“下载前总是询问”这个设置的约束。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 20:46 · PVG 04:46 · LAX 12:46 · JFK 15:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.