【问题标题】:reader.readasdataurl is not working in for loop javascript jqueryreader.readasdataurl 不适用于 for 循环 javascript jquery
【发布时间】:2019-02-04 12:48:34
【问题描述】:

在我的要求中,所有上传的文件都需要转换为 base64 格式并将它们的值推送到一个对象中。有时我得到了正确的输出,有时我没有得到它发送空值的值。下面是我的代码。

var fileControls = $('input[type="file"]');
var FilesObj = [];
for (var a = 0; a < fileControls.length; a++) {
    var files = fileControls[a].files;
    if (files.length > 0) {
        var sdd = fileControls[a].files[0];
        var reader = new FileReader();
        var Obj1 = new Object();
        // $(e.target).attr('id')
        reader.readAsDataURL(sdd);
        reader.onloadend = function (x,y) {
            Obj1.Key = x;
            // reader.readAsDataURL(y);
            var valRes = y.result;
            Obj1.Value = valRes;
            FilesObj.push(Obj1);
        }
        reader.onloadend(fileControls[a].id, reader);
    }
}

【问题讨论】:

    标签: javascript jquery for-loop


    【解决方案1】:

    您可以将onload 事件与参数一起使用。

    var FilesObj=[]; 
    function GetFiles(){
    var fileControls = $('input[type="file"]');
                for (var a = 0; a < fileControls.length; a++) {
                    var files = fileControls[a].files;
                    if (files.length > 0) {
                        var file = fileControls[a].files[0];
                        var reader = new FileReader();
                        var Obj1 = new Object();
                        // $(e.target).attr('id')
                        reader.readAsDataURL(file);                 
                        reader.onload = (function(f,id) {
                        return function(e) {
                        // Here you can use `e.target.result` or `this.result`
                        // `f.id`and `f.name`.
                         Obj1.Key = id;
                                    var valRes = this.result;
                                    Obj1.Value = valRes;
                                    FilesObj.push(Obj1);
                        };
                    })(file,fileControls[a].id);
                   }
                }
        }
        
        function ViewFiles (){
        $.each(FilesObj,function(i,obj){
        var $img = $("<img>").prop("id","img"+obj.Key).attr("src",obj.Value).prop("width","100").prop("height","100");
        $("#divImages").append($img);
        });
        }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <input type="file" id="file1">
    <input type="file" id="file2">
    <input type="file" id="file3">
    <input type="file" id="file4">
    <input type="file" id="file5">
    <br>
    <br>
    <br>
    
    <button type="button" onclick="GetFiles()">Get Files</button>
    <button type="button" onclick="ViewFiles()">View Files</button>
    
    <br>
    <br>
    <div id="divImages"></div>

    【讨论】:

    • 您可以发布您的逻辑以将值发送到您尝试发送的位置吗?
    • reader.readAsDataURL(sdd); reader.onload = function () { Obj1.Key = fileControls[a].id; var valRes = reader.result; Obj1.Value = valRes; FilesObj.push(Obj1); } reader.onload();
    • 所有都是相同的,而不是传递值,我直接分配值。请检查一次
    • 我在这行代码 Obj1.Value = reader.result 中得到了空值;
    • reader.readAsDataURL(sdd);这一行执行给出结果值有时它会跳过然后只有我得到 reader.result 值是空的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多