下载通过输入字段上传的 PNG 文件

Download a PNG file that was uploaded via an input field

我通过

上传了一个文件
<input> id="pdf" type="file"></input>

我可以通过

访问它的内容
var inp = document.querySelector("#pdf");
var text = await inp.files[0].text()

调用我的下载函数时出现“失败 - 网络错误”(Chromium),而在 Firefox 中没有任何反应(函数 returns 未定义)。

download("viainput.png",text);

但是我很难将同一个文件保存到文件系统,我总是得到损坏的文件。我的下一步是通过 webrtc 将其作为编码文本发送给另一个用户

function download(filename, text) {
  var element = document.createElement('a');
  element.setAttribute('href', 'data:image/png;base64,' + encodeURIComponent(text));
  element.setAttribute('download', filename);
 
  element.style.display = 'none';
  document.body.appendChild(element);
 
  element.click();
 
  document.body.removeChild(element);
}
 
// Start file download.
download("hello.png",'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==');

您当前的解决方案不起作用,因为您在本应采用 base64 编码的字符串中提供了 URL 编码的数据。但是忘了那个吧。 data: URL 大部分已成为过去(或应该成为过去)。

执行此操作的有效方法是将图像编码为字符串。相反,直接使用从输入中获得的文件。

var file = inp.files[0] // this is what you use
// as second argument for `download`

function download(filename, blob) {
  const link = document.createElement('a')
  const url = URL.createObjectURL(blob)
  link.href = url
  link.download = filename
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
  URL.revokeObjectURL(url) // if you're done with that file
}

您也可以将文件(原型为 Blob)直接发送到 WebRTC 数据通道,然后在另一端从接收到的 Blob 创建对象URL。