解决文件只能在windows系统上传成功,而linux系统上传失败。

2023-11-02

        场景:在我们项目准备上线进行SIT测试的时候,测试在文件上传的时候,一直上传不成功,表示当前文件不支持上传,然后我们让测试将他的文件发送给我们进行测试,我们是能够上传成功的,然后询问他们使用的什么系统,发现他们使用的是Linux发行版操作系统Ubuntu。

        分析原因:可能是由于Linux和Windows操作系统在处理文件类型和扩展名时的一些差异导致的。最后检查发现,Linux和Windows操作系统可能使用不同的方式来检测文件的MIME类型(file.type),或者可能返回不同的MIME类型。

        因为之前前端在进行校验的时候是通过file.type进行判断的,为了避免这个问题,所以直接使用文件的后缀进行判断是否可以上传,对于windows和linux来说处理方式都是一致的,这样就解决了文件上传的业务问题。

前端代码(修改之前的):

beforeUpload: async (file: File) => {
      if (file.size === 0) {
        message.error(`文件 ${file.name} 为空文件`);
        return Upload.LIST_IGNORE;
      }
      // 获取后缀
      let extension: any = file.name.split(".");
      extension = extension[extension.length - 1];
      
      if (
         
          extension === "rar" ||
          file.type ===
          "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
          file.type === "application/msword" ||
          file.type === "application/vnd.ms-word.document.macroEnabled.12" ||
          file.type === "application/vnd.ms-word.template.macroEnabled.12" ||
          file.type === "text/plain" ||
          file.type === "application/pdf" ||
          file.type === "application/x-zip-compressed" ||
          file.type === "application/octet-stream" ||
          file.type === "application/zip" ||
          file.type === "application/x-rar" ||
          file.type ===
          "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
          file.type === "application/vnd.ms-excel" ||
          file.type ===
          "application/vnd.openxmlformats-officedocument.spreadsheetml.template" ||
          file.type === "application/vnd.ms-excel.sheet.macroEnabled.12" ||
          file.type === "application/vnd.ms-excel.template.macroEnabled.12" ||
          file.type === "application/vnd.ms-excel.addin.macroEnabled.12" ||
          file.type === "application/vnd.ms-excel.sheet.binary.macroEnabled.12" ||
          file.type === "application/vnd.ms-powerpoint" ||
          file.type ===
          "application/vnd.openxmlformats-officedocument.presentationml.presentation" ||
          file.type ===
          "application/vnd.openxmlformats-officedocument.presentationml.template" ||
          file.type ===
          "application/vnd.openxmlformats-officedocument.presentationml.slideshow" ||
          file.type === "application/vnd.ms-powerpoint.addin.macroEnabled.12" ||
          file.type ===
          "application/vnd.ms-powerpoint.presentation.macroEnabled.12" ||
          file.type === "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"
      ) {
        // 添加到本地待上传
        let data = await getMinioUploadId(fileExtension,file.name);
        let run = new UploadChunk(file, data["upload_id"], data["filename"]);
        ....
      } //只提供主要代码

发现是使用的file.type进行判断,通过debug发现windows和linux返回的file.type是不一致的,所以使用了文件的后缀进行判断。

前端代码(修改之后的):

第一种方式:

        使用文件扩展名检测:不依赖于file.type来确定文件类型,而是使用文件的扩展名进行检测。

beforeUpload: async (file: File) => {
      if (file.size === 0) {
        message.error(`文件 ${file.name} 为空文件`);
        return Upload.LIST_IGNORE;
      }
      //允许上传的文件后缀
      const allowedExtensions = [
        "rar",
        "doc",
        "docx",
        "txt",
        "pdf",
        "zip",
        "xls",
        "xlsx",
        "ppt",
        "pptx",
      ];
        
      // 获取文件名不带后缀
      // const fileName:string = file.name.split(".").shift();
      // 获取后缀
      // @ts-ignore
      const fileExtension:string = file.name.split(".").pop();
      if (
          allowedExtensions.includes(fileExtension.toLowerCase())
          
      ) {
        // 添加到本地待上传
        let data = await getMinioUploadId(fileExtension,file.name);
        let run = new UploadChunk(file, data["upload_id"], data["filename"]);
        ...
      }//只提供主要代码

前端代码(修改之后的):

第二种方式:

        针对特定MIME类型的检测:如果您希望继续使用file.type,则需要确保您的条件可以正确检测到不同操作系统上的文件类型。

const allowedMimeTypes = [
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  "application/msword",
  // 添加其他支持的MIME类型,llowedMimeTypes数组包含了您在Linux和windows系统上遇到的所有需要支持的MIME类型。
];

if (allowedMimeTypes.includes(file.type)) {
  // 允许上传
  // ...继续上传的逻辑
} else {
  message.error(`${file.name} 并不是可上传文件`);
}

通过修改过后的代码进行测试,windows和linux系统操作我们部署的项目执行文件上传都能够上传成功了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决文件只能在windows系统上传成功,而linux系统上传失败。 的相关文章

随机推荐

  • 数组16--矩阵中的路径

    数组16 矩阵中的路径 jz65 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 请设计一个函数 用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径 路径可以从矩阵中的任意一个格子开始 每一步可以在矩阵中向左 向右 向
  • git分支管理

    git分支管理 1 主分支 Master 主分支 默认不会在该分支上进行开发 只会将稳定没有bug的代码合并到该分支上 2 开发分支 Develop 主要的开发分支 在master分支的基础上创建而来 该分支主要是保持最新的代码 用于测试
  • PHP制作验证码

    学习PHP 它的函数库太强大了 就觉得很神奇 创建验证码也是很有意思 记录一下吧
  • 【数据结构】顺序表---C语言版(数据结构开篇小菜,全网最详细!小白看一遍就学会!!!)

    文章目录 一 前言 1 什么是数据结构 二 顺序表的概念 线性表 1 什么是线性表 2 顺序表与数组的区别 三 顺序表详解 静态顺序表 动态顺序表 创建动态顺序表 接口1 定义结构体SL 接口2 初始化结构体 SLInit 接口3 检查结构
  • 我也谈谈闭包

    我也谈谈闭包 今天第一次在实际运用中遇到闭包的问题 我要给几个视频video增加鼠标悬停自动播放的功能 刚开始时 我只有一个video 代码如下 HTML li li
  • Matlab学习笔记(1)--Matlab基础矩阵运算学习

    最近接触并学习了Matlab 充分感受到了Matlab的强大 正所谓好记忆不如烂笔头 所以在此写一下学习笔记 以便后续温习 因为Matlab是一个十分重实践的软件 所以学习笔记我打算不按照常规写法来进行 而是通过作者在学习中做的练习题来进行
  • webpack5 学习(三)—— 管理资源:加载 images

    在 webpack 5 中 可以使用内置的 Asset Modules 来处理图像资源 webpack config js 修改webpack config js const path require path module exports
  • SoapUI工具---webservice接口(带图详细步骤)

    目录 首先 找一个接口 1 WEB服务 2 WSDL 界面 3 getMobileCodeInfo界面 SoapUI工具调用 1 打开界面 2 添加接口 3 执行接口 4 创建测试用例 5 添加断言 6 运行结果 编辑 首先 找一个接口 1
  • VS2010+opencv msvcprtd.lib(MSVCP90D.dll) : error LNK2005 error LNK2019等错误

    VS 2010 Opencv 遇到了msvcprtd lib MSVCP90D dll error LNK2005 error LNK 2019等多个错误 刚开始没注意 以为是opencv的库添加的有问题 仔细检查了之后发现库添加的没有问题
  • 人工智能学习(五)人工智能三巨头

    他们分别是杰弗里 辛顿 Geoffrey Hinton 约书亚 本吉奥 Yoshua Bengio 和扬 勒丘恩 Yann LeCun 这三个人通常被大众称为 深度学习三巨头 为什么要介绍他们呢 因为人工智能如今能够发展地如此迅猛 他们几个
  • 注意今晚停机更新

    注意今晚停机更新 LOL将在6月13日凌晨1点开始全区停机维护 请注意 6月13日0点将关闭排位赛入口 不会影响正在进行中的排位赛 发布13 12版本 预计停机时间为1 00 12 00 对于在停机期间结束的活动 其实际结束时间也将提前至停
  • MFC快速入门

    1 新建 MFC 2 直接进入框图界面 资源文件 rc Dialog 3 给控件添加消息处理函数 选中控件 右键 添加事件处理程序 跳转函数 写函数 4 在消息处理函数中添加自定义功能 在我们使用任意一种方法添加了消息处理函数以后 都只能得
  • unity3D 《见缝插针》--得分显示、结束动画、以及游戏的重置

    一 得分显示 1 首先在scene新建一个Text的UI组件 它在Canvas面板下 2 进行缩放 3 为Canvas添加脚本 代码如下 public static int scoreValue public Text scoreText
  • 【Android】常用对话框大全(三)自定义Dialog的三种方式(Theme,PopupWindow,Dialog)

    Android Dialog自定义的方式有很多 例如 Theme Dialog PopupWindow AlertDialog View等方式 Android常用对话框系列文章 Android 常用对话框大全 一 Android Dialo
  • [毕业设计]LaTeX论文模板排版

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • matplotlib—画正弦、余弦函数图

    一 导入模块 import matplotlib pyplot as plt import numpy as np plt rcParams font sans serif SimHei 用于正常显示中文标签 plt rcParams ax
  • 人工智能与神经网络-激活函数

    人工神经元的工作原理 大致如下 上述过程的数学可视化过程如下图 激活函数 Activation Function 是一种添加到人工神经网络中的函数 旨在帮助网络学习数据中的复杂模式 类似于人类大脑中基于神经元的模型 激活函数最终决定了要发射
  • 【宝塔面板建站】01. 5分钟windows宝塔面板的安装(保姆级图文)

    目录 1 下载宝塔面板 2 安装宝塔面板 3 初始化面板 4 安装套件 关于建站使用 总结 宝塔面板建站 分享宝塔面板从安装到实战的宝塔面板本机免云服务器免域名搭建网站等内容 欢迎关注 宝塔面板建站 系列 持续更新中 欢迎关注 宝塔面板建站
  • 机器人学之动力学笔记【11】—— 拉格朗日 动力学方程

    机器人学之动力学笔记 11 拉格朗日 动力学方程 1 拉格朗日法 2 举例 An RP Manipulator 3 转换到笛卡尔空间下 4 考虑能量损耗 1 拉格朗日法 之前我们学习了如何使用牛顿 欧拉法 基于力和力矩分析 建立机械臂的动力
  • 解决文件只能在windows系统上传成功,而linux系统上传失败。

    场景 在我们项目准备上线进行SIT测试的时候 测试在文件上传的时候 一直上传不成功 表示当前文件不支持上传 然后我们让测试将他的文件发送给我们进行测试 我们是能够上传成功的 然后询问他们使用的什么系统 发现他们使用的是Linux发行版操作系