背景:数据可以直接下载到默认路径,目标是需要浏览器弹出下载对话框让用户选择下载路径。为内存中的数据生成的 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 ,其他方案?
1
xiangyuecn 2023-06-19 15:09:40 +08:00
<a href="" download="文件名"
|
2
okakuyang 2023-06-19 15:14:58 +08:00 via iPhone
用 a 标签触发下载
|
3
x77 OP @xiangyuecn
@okakuyang 点击可以下载,但是浏览器没有弹出下载对话框,直接下载到默认目录去了。右键另存为可以弹出下载对话框并且正常下载,但是要多个操作。希望(左键)点击 <a> 可以让浏览器弹出下载对话框 |
5
x77 OP @okakuyang
没加,不弹对话框直接下载。 加了,不弹对话框直接下载。`<a download='1.dat' href=$url>download</a>` 不管加没加,右键->save as 都有对话框 |
6
okakuyang 2023-06-19 16:14:56 +08:00 via iPhone
@x77 理解你的需求了,我首先能想到的是用 filesystem 的 api 可以打开一个保存对话框,但是这个只有在高版本 chrome 上才有支持。我搜索一下有没有其他方案。
|
7
xiangyuecn 2023-06-19 16:22:37 +08:00
chrome 设置 -> 下载内容 -> 勾选 “下载前询问每个文件的保存位置”
感觉你应该试试 IE ,完全符合你的要求🐶 下载到哪里,完全是浏览器任性,chrome 的默认下载位置确实傻缺。 |
8
okakuyang 2023-06-19 16:24:26 +08:00 via iPhone
@x77 看了一圈 ,似乎都是用 filesystem 的 showsavefilepicker()这个办法。如果只考虑 chrome 可以试试。
|
9
mxT52CRuqR6o5 2023-06-19 16:36:06 +08:00
下载文件具体是弹窗还是直接下载是浏览器行为,js 控制不了的
要么就像上面几层说的用 filesystem 的 api |
10
x77 OP @xiangyuecn
每次下载都询问,勾了 |
11
x77 OP |
12
kingofzihua 2023-06-19 16:46:34 +08:00
|
13
x77 OP @kingofzihua
用过 FileSaver.js ,用 Dart 调用它 JS 的函数,也用过其他监听 Click 的 JS 方案。同样的代码放到 HTML 页面里可以弹框下载,放到 Flutter Web App 就变成不弹框直接下载。 不刚了,估计和 Flutter Web 的环境关系不大,可能和 Blob 链接有关系或是 Bug ,Blob 链接不受“下载前总是询问”这个设置的约束。 |