Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将href转换为文件的base64版本_Javascript_Base64 - Fatal编程技术网

Javascript 将href转换为文件的base64版本

Javascript 将href转换为文件的base64版本,javascript,base64,Javascript,Base64,我有一个锚点 <a id='clicktodownload' href='/getfile?yadayadayada' download='1.3.6.1.2.3.4.111.234'> 我可以用鼠标点击下载,或者: document.querySelector('clicktodownload').click() 这个锚中的“东西”可以是pdf类型、压缩文件或任何其他类型的文件。这是未知的 下载时是否可以获取文件的base64表示形式,而无需实际下载它并在javascript内

我有一个锚点

<a id='clicktodownload' href='/getfile?yadayadayada' download='1.3.6.1.2.3.4.111.234'>
我可以用鼠标点击下载,或者:

document.querySelector('clicktodownload').click()
这个锚中的“东西”可以是pdf类型、压缩文件或任何其他类型的文件。这是未知的

下载时是否可以获取文件的base64表示形式,而无需实际下载它并在javascript内存中设置它

我所需要的只是给它设置一个变量,但实际上不触发下载

可以使用jQuery,但遗憾的是fetch无法使用。这需要与ie11兼容


如果需要更多的信息,请询问。谢谢。

如果文件来自同一域,并且没有跨源请求,那么您只需对
href
值进行XMLHttpRequest,并请求响应为Blob:

var xhr = new XMLHttpRequest();
xhr.open('get', clicktodownload.href);
xhr.responseType = 'blob';
xhr.onload = processResponse;
xhr.send();
这将返回一个Blob,其
类型设置为服务器作为responseType发送的任何内容,因此如果获得正确的类型很重要,请确保服务器知道它发送的内容

现在,我建议您直接处理返回的Blob,例如,如果您想以
的形式显示它,您可以这样做

function processResponse(evt) {
  var blob = evt.target.result;
  var url = URL.createObjectURL(blob);
  iframe.src = url;
  // don't forget to call URL.revokeObjecURL(iframe.src) when not needed anymore
}

但是,如果您确实需要b64版本(例如,将其包含在svg等独立文档中),那么您可以使用。

也希望添加,jquery的使用是可以的,但是fetch()并不不幸,因为这需要在IES中工作。请编辑您的问题,而不是在其下方添加注释。一个答案是使用XmlHttpRequest(又名AJAX)。在某些浏览器中,对文件输入强制执行
.click()
。但实际上,您应该限制文件类型。你在拿文件你甚至不知道它们是什么?你想用它们做什么?如果您的意思是希望使用JavaScript查看文件,而不将其加载到服务器上,那么可以使用文件读取器API。签出。更新问题@DaveS@PHPglue我不想解释为什么我想实现上述目标的原因,只想讨论这是否可能。我正在寻找的是一种只获取文件二进制数据的方法,而不必将文件下载到内存中。我使用的方法与您发布的方法完全相同,但将数据作为数组缓冲区返回,我很好奇是否可以将其与base64一致。谢谢你的作品!console.logging我得到的blob:blob(2402581){size:2402581,type:“application/x-7z-compressed”}size:2402581 type:“application/x-7z-compressed”proto:blob
function processResponse(evt) {
  var blob = evt.target.result;
  var url = URL.createObjectURL(blob);
  iframe.src = url;
  // don't forget to call URL.revokeObjecURL(iframe.src) when not needed anymore
}