
背景:数据可以直接下载到默认路径,目标是需要浏览器弹出下载对话框让用户选择下载路径。为内存中的数据生成的 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 理解你的需求了,我首先能想到的是用 ilesystem 的 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 链接不受“下载前总是询问”这个设置的约束。 |