【问题标题】:Wait for user to finish downloading a blob in Javascript等待用户在 Javascript 中完成下载 blob
【发布时间】:2015-03-22 21:48:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 是否正在使用 jQuery 库选项?
  • 我知道有点晚了,但你有没有想过这里有什么?我在我的网络应用程序中保存一些二进制数据,我想在保存完成后撤销缓冲区。它实际上在网页处于活动状态时保留在内存中 - 因此数据对象 url 的引用在用户离开页面或关闭页面之前不会被释放。
  • 很遗憾没有。我在其他地方得到了一些关于使用窗口焦点事件的建议,但我从来没有能够让它以可预测的方式工作。不确定在过去的几年中是否有任何发展可以允许这样做,但这就是我停下来的地方。对不起。 :-(

标签: javascript file save blob synchronous


【解决方案1】:

这对我有用。

/**
 *
 * @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)
}

我知道其他人也有这个问题:

附:我很欣赏@sickinghttps://github.com/whatwg/html/issues/954#issue-144165132 的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2012-12-24
    • 2022-07-27
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多