【feature】支持 Blob 下载的一种方式 #455
Closed
jeasonnow
started this conversation in
Show and tell
Replies: 2 comments 2 replies
-
思路牛B,我在代码里面试试 |
Beta Was this translation helpful? Give feedback.
1 reply
-
如果动态创建的 a 标签不 append 到真实的文档而只停留在内存中,那么会存在无法检测点击事件问题,目前在 figma 发现了该现象,可能需要改变捕获下载事件的位置。 // if don't append to document
var url = URL.createObjectURL(blob);
var element = document.createElement("a");
element.href = url;
var hasAnchorDownload = typeof element["download"] != "undefined";
if (hasAnchorDownload) {
element["download"] = name
}
if (_PlatformInfoObj.isSafari()) {
if (!hasAnchorDownload) {
element["target"] = "_blank"
}
element.click()
} else if (_PlatformInfoObj.isFirefox()) {
document.body.appendChild(element);
element.click();
document.body.removeChild(element)
} else {
element.click()
} 解法也很简单,直接捕获 const backup = document.createElement;
document.createElement = function(el) {
if (el === 'a') {
const a = backup.call(document, el);
const clickEvent = a.click || (() => {});
Object.defineProperties(a, {
click: {
get: () => {
const downloadInfo = {url: a.href, download: a.download};
// download with this info
console.log(downloadInfo);
return clickEvent.bind(a);
}
}
})
return a;
}
return backup.call(document, el);
} |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
这是关于什么?
这里讨论下我折腾下载的一些思路,目前解决了在
Pake
中无法通过blob
方式下载文件的问题。思路
createObjectUrl
中blob
和blob url
的映射关系。click
全局监听捕获a
标签模拟点击下载blob url
事件,通过上一步获取的映射关系拿到完整的blob
以及下载文件名(通过 a.download )Tauri
中的全局api
在点击事件发起的同时,使用 writeBinaryFile 将通过FileReader
转换blob
得到的 ArrayBuffer 直接存储到硬盘中。实现
需要补充的问题
api
的权限且配置对应的可调用api
域名配置:dangerousDisableAssetCspModificationcli
生成项目模板的逻辑,通过获取生成应用的url
并将其替换到模板中的pake.json
和tauri.conf.json
中并新增部分权限配置才能保证功能的正常,和原有的通过jsBridge
调取rust API
的设计有些出入。最后
欢迎大家讨论下,我觉得思路应该是没问题的,关键在于 blob -> binary -> download 的链路中,download 到底是该在 js 中调用,还是在 rust 中调用。
Beta Was this translation helpful? Give feedback.
All reactions