You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3使用FileReader读取JSON文件报错:参数非Blob类型

解决v-file-input读取JSON文件时的Blob类型错误

问题场景

使用Vuetify的v-file-input组件导入JSON文件,尝试通过FileReader读取文件内容并解析为JSON对象,却触发以下错误:

Uncaught TypeError: Failed to execute 'readAsText' on 'FileReader': parameter 1 is not of type 'Blob'.

用户原代码如下:

<template>
<v-file-input accept=".json" v-model="selectedFile" label="Application's Data File"></v-file-input>
<v-btn class="my-3 ml-10" v-if="validated" @click="validate">Validate</v-btn>
</template>
<script setup>
const selectedFile = ref();
const validated = ref(true);
const validate = () => {
    const file = selectedFile instanceof FileList ? selectedFile[0] : selectedFile;
    if (file) {       
        const reader = new FileReader();
        reader.onload = (e) => {
            console.log(e.target.result);
            const content = e.target.result;
            try {
                const jsonObject = JSON.parse(content);
                console.log(jsonObject); // This is the parsed JSON object
            } catch (error) {
                console.log("Invalid JSON file:", error);
            }
        };
        reader.readAsText(selectedFile);
    }
};
</script>

错误原因

代码中已经正确判断并提取了file变量(处理了FileList的情况),但调用reader.readAsText()时错误传入了selectedFile——这是一个Vue响应式ref对象,而非实际的File/Blob类型,导致readAsText方法参数类型不匹配。

修正方案

将reader.readAsText(selectedFile)改为reader.readAsText(file),同时添加逻辑展示JSON对象的键:

<template>
<v-file-input accept=".json" v-model="selectedFile" label="Application's Data File"></v-file-input>
<v-btn class="my-3 ml-10" v-if="selectedFile" @click="validate">Validate</v-btn>
<!-- 展示JSON对象的键 -->
<v-card v-if="jsonKeys.length">
  <v-card-title>JSON对象的键</v-card-title>
  <v-card-text>
    <ul>
      <li v-for="key in jsonKeys" :key="key">{{ key }}</li>
    </ul>
  </v-card-text>
</v-card>
</template>
<script setup>
import { ref } from 'vue';
const selectedFile = ref();
const jsonKeys = ref([]);

const validate = () => {
    // 单文件模式下,v-file-input的v-model直接绑定File对象
    const file = selectedFile.value;
    if (file) {       
        const reader = new FileReader();
        reader.onload = (e) => {
            const content = e.target.result;
            try {
                const jsonObject = JSON.parse(content);
                // 提取并存储JSON对象的键
                jsonKeys.value = Object.keys(jsonObject);
            } catch (error) {
                console.log("Invalid JSON file:", error);
                jsonKeys.value = [];
            }
        };
        // 传入正确的File对象
        reader.readAsText(file);
    }
};
</script>

额外说明:Vuetify的v-file-input默认是单文件选择模式,v-model绑定的直接是File对象;如果开启了multiple属性,才会返回FileList,此时需要遍历获取单个文件。

内容的提问来源于stack exchange,提问作者StRaNgEr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:37:13