excel文件类型自动判断

该文章介绍了一种优化的Excel文件类型判断方法,通过结合文件的魔数(magic number)和后缀名来确保准确识别。在处理可能后缀名不准确的文件时,这种方法能有效避免错误。代码示例展示了如何使用FileMagic来检查输入流的类型,并根据文件名做进一步判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际excel读取中,会出现很多后缀为xlsx 内容实际确为xls的情况,反之亦然。所以光利用文件后缀名读取excel文件时,会有偏差。

本文则利用魔数以及结合文件后缀名共同判断excel文件类型,达到文件识别基本无误的情况

/**
 * excel 类型获取 注意fileMagic 仅3.17之后的版本才有
 *
 * @param inputStream
 * @return
 * @author zms
 */
public static String checkExcelFileType(InputStream inputStream) {
    String type = "";
 try {
        /**
 * 优化excel类型判断
 * 注意可能会获取报错 getFileMagic() only operates on streams which support mark(int)
 * 原因InputStream中markSupported方法返回值为false造成的,BufferedInputStream中返回值是true,所以改为InputStream is = new BufferedInputStream(multipartFile.getInputStream())
 */
 FileMagic fileMagic = FileMagic.valueOf(inputStream);
 if (Objects.equals(fileMagic, FileMagic.OLE2)) {
            return EXCEL2003;
 } else if (Objects.equals(fileMagic, FileMagic.OOXML)) {
            return EXCEL2007;
 }
    } catch (Exception e) {
        e.printStackTrace();
 return "error";
 }
    return type;
}

/**
 * 根据名字和流判断文件类型
 *
 * @param fileName
 * @param inputStream
 * @return
 */
public static String getExcelType(String fileName, InputStream inputStream) {
    String excelType = checkExcelFileType(inputStream);
 if ("error".equals(excelType)) {
        if (LogicUtil.isNotEmpty(fileName)) {
            if (fileName.endsWith(EXCEL2003)) {
                return EXCEL2003;
            } else if (fileName.endsWith(EXCEL2007)) {
                return EXCEL2007;
            }
        }
    }
    return excelType;
}
 
### Vue3 中实现自动检测文件类型的方法 在 Vue3 项目中,可以通过前端技术来实现对文件类型自动检测功能。以下是具体的技术细节以及其实现方式。 #### 方法概述 为了实现文件类型自动检测,在 Vue3 的环境中可以利用 JavaScript 提供的 `File` 和 `Blob` 对象的相关属性来进行操作。这些对象提供了诸如 `type` 属性,能够帮助开发者获取上传文件的具体 MIME 类型[^1]。 #### 使用 File API 获取文件类型 当用户通过 `<input type="file">` 或其他方式进行文件上传时,可以通过监听事件捕获文件数据,并调用其内置的 `.type` 属性来判断文件类型: ```javascript // HTML 部分 <template> <div> <input type="file" @change="handleFileChange" /> </div> </template> // Script 部分 (Vue3 Composition API) <script setup> import { ref } from 'vue'; const handleFileChange = (event) => { const file = event.target.files[0]; if (!file) return; console.log('文件名称:', file.name); console.log('文件大小:', file.size, '字节'); console.log('MIME 类型:', file.type); // 判断文件类型是否为图片 if (file.type.startsWith('image/')) { alert(`这是一个图像文件 (${file.type})`); } }; </script> ``` 上述代码展示了如何通过监听输入框的变化事件 (`@change`) 来读取用户的文件选择行为,并进一步解析该文件的 MIME 类型。如果文件是一个图片,则会弹窗提示具体的子类型(如 PNG、JPEG 等)。此逻辑同样适用于 Excel 文件或其他文档类别的检测[^2]。 #### 结合后端接口验证文件类型 尽管前端可以初步完成文件类型的判定工作,但在某些场景下可能还需要依赖服务器返回的结果作为最终依据。此时可以在发送请求给服务端之前先做本地校验,再结合响应头中的信息确认无误后再执行后续动作,比如保存或者展示预览等功能。 例如,对于下载远程资源的情况,我们通常会在发起 GET 请求的同时指定 `{ responseType: 'blob' }` 参数以便于处理二进制流形式的数据包。之后可以根据接收到的内容推断出确切的目标格式[^3]: ```javascript async function fetchRemoteFile(url) { try { const response = await axios.get(url, { responseType: 'blob' }); let fileType; switch(response.headers['content-type']) { case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': fileType = '.xlsx'; break; default: fileType = ''; } const blob = new Blob([response.data], { type: response.headers['content-type'] }); saveAs(blob, `example${fileType}`); } catch(error){ console.error("Error fetching the remote file:", error.message); } } ``` 以上片段演示了一个异步函数用于抓取网络上的某个地址对应的电子表格资料,并尝试识别它的原始扩展名以便正确命名导出后的副本[^4]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值