gpt4 book ai didi

javascript - 等待用户在 Javascript 中完成下载 blob

转载 作者:行者123 更新时间:2023-12-03 20:20:32 24 4
gpt4 key购买 nike

在 Javascript 中,我创建了许多想要提示用户保存为文件的 blob。目前,我正在使用 URL.createObjectURL ,将 URL 放置在链接中,并模拟对链接的点击。 (当然,我调用 URL.revokeObjectURL 来释放 URL,以便在用户保存 blob 后可以丢弃它。)我有一个循环运行,并为我希望用户保存的每个 blob 执行此操作。

至少在火狐上,触发链接是一个异步操作;我调用 click()在用户选择保存文件的位置之前,我生成其余 blob 的循环会立即继续执行。

这带来了一些问题,因为每个 blob 都可能有点大,而且可能有很多。我可以很容易地预见到这样一种情况,即没有足够的内存将它们全部保存在内存中,等待用户一个接一个地保存和释放它们。所以我想生成一个blob,让用户下载它,然后,在文件保存后(因此有资格被垃圾收集器丢弃),继续生成下一个blob并让用户保存它。

有没有什么方法可以实现这一点,而无需用户手动单击另一个按钮或类似的东西来指示页面他已完成保存文件?

最佳答案

这对我有用。

/**
*
* @param {object} object A File, Blob, or MediaSource object to create an object URL for. https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
* @param {string} filenameWithExtension
*/
function saveObjectToFile (object, filenameWithExtension) {
console.log('saveObjectToFile: object', object, 'filenameWithExtension', filenameWithExtension)
const url = window.URL.createObjectURL(object)
console.log('url', url)
const link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.target = '_blank'
link.download = filenameWithExtension
console.log('link', link)
document.body.appendChild(link)
link.click()
window.setTimeout(function () {
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
}, 0)
}

/**
* @param {string} path
* @param {object} payload
* @param {string} filenameWithExtension
* @returns {promise}
*/
export async function downloadFileInBackground (path, payload, filenameWithExtension) {
console.log('downloadFileInBackground awaiting fetch...')
const response = await fetch(path, {
method: 'POST',
cache: 'no-cache',
headers: {
'Content-Type': 'application/json'
},
body: payload // body data type must match "Content-Type" header
})
console.log('response', response)
const blob = await response.blob()
saveObjectToFile(blob, filenameWithExtension)
console.log('downloadFileInBackground finished saving blob to file!', filenameWithExtension)
}
我知道其他人也有这个问题:
  • https://stackoverflow.com/a/55705784/470749
  • https://stackoverflow.com/a/37240906/470749
  • https://stackoverflow.com/a/30708820/470749
  • Wait for user to finish downloading a blob in Javascript
  • https://stackoverflow.com/a/50698058/470749

  • 附:我很欣赏@sicking 在 https://github.com/whatwg/html/issues/954#issue-144165132 的想法.

    关于javascript - 等待用户在 Javascript 中完成下载 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29200256/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com