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

2023-06-19 14:49:56 +08:00
 x77

背景:数据可以直接下载到默认路径,目标是需要浏览器弹出下载对话框让用户选择下载路径。为内存中的数据生成的 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 ,其他方案?

1299 次点击
所在节点    程序员
13 条回复
xiangyuecn
2023-06-19 15:09:40 +08:00
<a href="" download="文件名"
okakuyang
2023-06-19 15:14:58 +08:00
用 a 标签触发下载
x77
2023-06-19 15:17:32 +08:00
@xiangyuecn
@okakuyang

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

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

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

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

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

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

不刚了,估计和 Flutter Web 的环境关系不大,可能和 Blob 链接有关系或是 Bug ,Blob 链接不受“下载前总是询问”这个设置的约束。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/949981

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX