TypeError:无法在“FileReader”上执行“readAsDataURL”:参数 1 不是“Blob”类型

Posted

技术标签:

【中文标题】TypeError:无法在“FileReader”上执行“readAsDataURL”:参数 1 不是“Blob”类型【英文标题】:TypeError: Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob' 【发布时间】:2021-12-04 10:19:38 【问题描述】:

我已经为此苦苦挣扎了几天。我不知道为什么它一直说我的文件不是一种 blob。有什么帮助吗?

下面是 html

<form style="padding-top:10px;" method="post" action="upload.php" enctype="multipart/form-data">
                                    <input style="padding-bottom: 20px;" type="file" id="file" name="file" onchange="fileValidation(this);">
                                    <div id="responsefromfileupload" value=""></div>
                                </form>

以下是 javascript

function fileValidation(reader) 

var file = $("input[type=file]").get(0).files[0];
var fileInput = document.getElementById('file');
var filePath = fileInput.value;

// Allowing file type
var allowedExtensions =
    /(\.jpg|\.jpeg|\.png|\.gif)$/i;


if (!allowedExtensions.exec(filePath)) 

$("#responsefromfileupload").replaceWith(`<div style="width: 50%;" class="alert alert-danger" role="alert">
                                                    This image file type is not accepted!</div>`);
    


if (allowedExtensions.exec(filePath)) 

    var reader = new FileReader();

    reader.onload = function () 
        $("#previewImg").attr("src", reader.result);
        $("#previewImg").attr("margin-left", "25%");
    

  
  reader.readAsDataURL(file);

【问题讨论】:

尝试将 fileValidation(this) 替换为 fileValidation(event)。在 fileValidation 中将 reader 重命名为 event 并检查 readAsDataURL 中的 event.target.files[0]。如果您创建一个可运行的示例,可能更容易获得帮助 @DraganS 我是新手,如何制作可运行的示例? 请检查我的帖子 - 稍微更改了您的原始代码。 【参考方案1】:

function fileValidation(event) 

var file = event.target.files[0];
var fileInput = document.getElementById('file');
var filePath = fileInput.value;

// Allowing file type
var allowedExtensions =
/(\.jpg|\.jpeg|\.png|\.gif)$/i;


if (!allowedExtensions.exec(filePath)) 

$("#responsefromfileupload").replaceWith(`<div style="width: 50%;" class="alert alert-danger" role="alert">
                                                This image file type is not accepted!</div>`);



if (allowedExtensions.exec(filePath)) 

var reader = new FileReader();

reader.onload = function () 
    $("#previewImg").attr("src", reader.result);
    $("#previewImg").attr("margin-left", "25%");


  
  reader.readAsDataURL(file);

<form style="padding-top:10px;" method="post" action="upload.php" enctype="multipart/form-data">
                                <input style="padding-bottom: 20px;" type="file" id="file" name="file" onchange="fileValidation(event);">
                                <div id="responsefromfileupload" value=""></div>
                            </form>

你可以使用的模板——去掉

【讨论】:

非常感谢,您的 var 文件变量实际上已修复它。你知道为什么只有在我选择了两次图像后才会显示警报 (#responsefromfileupload) 吗? 尝试选择不同的文件 :) 猜测第二次不会触发 onchange 我有点困惑(对不起,对这个世界很陌生)我怎样才能第一次让 onchange 着火?或者你知道为什么 onclick 会做同样的事情吗? 检查 。有一个 onchange 属性。选择文件后,将执行分配的处理程序。如果您第二次选择相同的文件(据我所知),“什么都没有”改变。比如,你可以在每次处理 onchange 后重新设置它的值,然后每次都会执行 onchange 处理程序。 但它甚至不会在我第一次选择文件时触发,它只会在我第二次选择文件时触发。

以上是关于TypeError:无法在“FileReader”上执行“readAsDataURL”:参数 1 不是“Blob”类型的主要内容,如果未能解决你的问题,请参考以下文章

FileReader 和 BufferedReader 的作用——为啥要包装 FileReader?

Vue.js报错—TypeError: Cannot read property 'Name' of undefined

TypeError:无法读取属性“集合”[重复]

Mongoose TypeError:TypeError:无法使用“in”运算符在未定义中搜索“pluralization”

TypeError:无法在反应中读取 null 的属性“名称”

TypeError:无法在reactjs登录页面中获取