【问题标题】:Storing a base64 converted file in a variable for later use将 base64 转换后的文件存储在变量中以备后用
【发布时间】:2018-03-23 09:10:54
【问题描述】:

情况:

用户可以选择附加文件的表单,带有一个简单的文件选择器,它在文件被选择后立即将其转换为 Base64 并存储以供以后使用。

var handleFileSelect = function(evt) {
    var files = evt.target.files;
    var file = files[0];
    if (files && file) {
        var reader = new FileReader();

        reader.onload = function(readerEvt) {
            var binaryString = readerEvt.target.result;
            konvertierteDatei = btoa(binaryString);
        };

        reader.readAsBinaryString(file);
    }
};

if (window.File && window.FileReader && window.FileList && window.Blob) {
    document.getElementById('attachementName').addEventListener('change', handleFileSelect, false);
} else {
    alert('Die Datei APIs werden von diesem Browser nicht vollständig unterstützt.');
}

问题

它之前使用了一种糟糕的解决方法,我将 base64 编码文件存储在隐藏的 textarea 中,然后通过获取所述 textarea 的值将其添加到我的 JSON 数据中。

我想通过将编码文件存储在konvertierteDatei 中并稍后将其值添加到数据中来使这个“更好”,但无论如何我都无法正常工作。

解决方案:

编辑:这是一个有效的 sn-p,看起来像 @H.B.是的,我试图从不同的范围访问konvertierteDatei

var handleFileSelect = function(evt) {
var files = evt.target.files;
var file = files[0];
if (files && file) {
    var reader = new FileReader();

    reader.onload = function(readerEvt) {
        var binaryString = readerEvt.target.result;
        konvertierteDatei = btoa(binaryString);
        document.getElementById("base64textarea").value = btoa(binaryString);
    };

    reader.readAsBinaryString(file);
}
};

if (window.File && window.FileReader && window.FileList && window.Blob) {
document.getElementById('attachementName').addEventListener('change', handleFileSelect, false);
} else {
alert('Die Datei APIs werden von diesem Browser nicht vollständig unterstützt.');
}
<input class="infrastruktur__input infrastruktur__input---file" id="attachementName" type="file"/>
<br>
<h1>Base64 encoded file</h1>
     <textarea id="base64textarea" placeholder="Base64 will appear here" cols="50" rows="15"></textarea>

【问题讨论】:

  • 您是否尝试将其存储在浏览器内存中?
  • konvertierteDateireader.onload 被触发之前不会被分配。你确定这会发生吗? (如果读者遇到错误会发生什么?)另外,您确定btoa(binaryString) 按预期工作吗?
  • @TimothyGroote: btoa 是一个原生 JS 函数,用于编码为 base-64。
  • 我不知道该代码是否有任何问题,除了它在语法上似乎是正确的事实。我需要查看随附的 HTML 来判断您是否尝试以正确的方式获取元素。 (另外,为了帮助我们帮助您,如果您可以发布所有代码以制作一个最小的工作示例,让我们重现您的问题,那就太好了)
  • 您的代码按我的预期工作。当我在分配后记录konvertierteDatei 的值时,它会记录base64 值。也许您尝试在错误的范围内或在错误的时间访问该值?

标签: javascript json file variables base64


【解决方案1】:

您的大部分代码似乎应该可以运行,但我认为您正试图在元素存在于 DOM 或其他东西之前添加事件侦听器。

添加一个事件监听器来等待 DOM 完成加载所有元素就足以让我让它工作了;

var handleFileSelect = function(evt) {
    alert("file selected");
    var files = evt.target.files;
    var file = files[0];
    if (files && file) {
        var reader = new FileReader();

        reader.onload = function(readerEvt) {
            var binaryString = readerEvt.target.result;
            konvertierteDatei = btoa(binaryString);
            console.log(konvertierteDatei);
        };

        reader.readAsBinaryString(file);
    }
};



document.addEventListener("DOMContentLoaded", function() { 
    if (window.File && window.FileReader && window.FileList && window.Blob) {
       document.getElementById('attachementName').addEventListener('change', handleFileSelect, false);
    } else {
        alert('Die Datei APIs werden von diesem Browser nicht vollständig unterstützt.');
    }
});
&lt;input class="formOne__input formOne__input---file" id="attachementName" type="file"/&gt;

【讨论】:

  • 我会接受这个作为答案,因为这是 IE 引起的一些问题的解决方案。然而,最初的问题是由于我试图访问其范围之外的变量。谢谢!
猜你喜欢
  • 2017-12-10
  • 2011-04-28
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 2013-11-13
  • 2021-01-30
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多