提供多个用于下载的base64图像。

11 浏览
0 Comments

提供多个用于下载的base64图像。

我的Django应用程序有一个带有Base64编码图片的模型。\n我想在我的ListView中添加一个选项,可以将所有显示的图片下载到用户选择的位置。\n我应该创建一个AJAX视图,还是可以由jQuery处理?\n我在谷歌上搜索了一些示例,看到了一些提供单个文件下载的例子。但是如何同时提供所有图片的下载呢?

0
0 Comments

问题的原因是在页面上同时下载多个base64格式的图片会导致浏览器给出警告或弹出多个保存对话框,给用户带来不便。解决方法是使用JSZip库将多个图片打包成一个zip文件供用户下载。以下是具体的解决方法:

首先,在页面中插入一个按钮和多个带有class属性为"dl"的img标签,每个img标签的src属性为对应图片的base64编码。

接着,在页面中插入以下JavaScript代码:

function download(data, file_name) {
  const a = document.createElement("a")
  a.href = data
  const extension = data.match(/^data:(.*?)\/(.*?);/)[2]
  a.setAttribute("download", file_name + "." + extension)
  a.style.display = "none"
  a.addEventListener("click", e => e.stopPropagation()) // not relevant for modern browsers
  document.body.appendChild(a)
  setTimeout(() => { // setTimeout - not relevant for modern browsers
    a.click()
    document.body.removeChild(a) 
  }, 0)
}
function download_all() {
  [...document.getElementsByClassName("dl")]
    .forEach((img, i) => download(img.src, "img" + i))
}
document
  .getElementById("dl_all")
  .addEventListener("click", download_all)

然后,在页面中插入一个按钮,id为"dl_all",并给它添加点击事件监听器,点击按钮时会调用download_all函数,该函数会遍历所有带有class属性为"dl"的img标签,将每个img标签的src属性传给download函数进行下载,文件名为"img" + i,其中i为img标签在遍历中的索引值。

最后,引入JSZip库,并在页面中插入一个按钮,id为"dl_all_oldschool",并给它添加点击事件监听器,点击按钮时会调用download_all_oldschool函数,该函数会使用JSZip库将所有带有class属性为"dl"的img标签的base64编码打包成一个zip文件,然后通过设置window.location.href实现文件的下载。

总结起来,通过以上的解决方法,我们可以实现在页面中同时下载多个base64格式的图片,且可以选择将图片打包成zip文件进行下载,提供了更好的用户体验。

0