【问题标题】:Why I am getting mimetype text/plain for CSV file using JMimeMagic lib?为什么我使用 JMimeMagic lib 获取 CSV 文件的 mimetype text/plain?
【发布时间】:2012-01-30 13:12:49
【问题描述】:

我正在使用 JMimeMagic 库来验证 CSV 文件上传。

对于 CSV 和所有其他文本文件(txt、JSP 等),它为我提供了 text/plain mime 类型。

logger.debug("Checking magic content");
MagicMatch match;
match = Magic.getMagicMatch(getPromotionOptIn().getUpload(),false);
logger.debug("Actual file mimetype=" + match.getMimeType());

我不应该为 CSV 文件获取 text/csv 吗? (See 所有 mime 类型列表)。

或者,我将验证放在 text/plain 上,认为它是一个有效的 CSV 文件,这很好。

【问题讨论】:

    标签: java mime-types


    【解决方案1】:

    我的猜测是 JMimeMagic 使用文件的前几个字节来确定类型。这对于许多不同的文件类型是可能的,因为它们具有非常标准的标题。一些文本文件,如 HTML,会在靠近开头的某处有文本 <html,因此您可以很好地猜测它是什么类型的文件。

    CSV 文件无法进行此类扣除。它们没有标准标题。很难以编程方式从带有逗号的购物清单中分辨出 CSV 文件。它确实为您提供了 text/plain 的正确答案,就像所有 CSV 文件一样。

    【讨论】:

      【解决方案2】:

      由于 CSV 文件可以有多个不同的分隔符,我怀疑 csv 文件只是被识别为文本文件(这是真的)。​​

      如果您看到一个文本文件,如何确定它是 CSV 文件?文中是否有逗号、分号等?如果它们属于一个条目,而分隔符是其他东西(如 |、#、@ 等)怎么办?

      如果没有更多信息,您将难以确定,JMimeMagic 也会遇到同样的问题。因此它只会返回它所确定的内容:该文件是一个文本文件。因此,您“仅”获得“文本/纯文本”。

      我不知道那个库,但从文档/源代码看来,您似乎可以提示 *.csv 文件具有 text/csv 使用 Magic.addHint("csv", someMatcher) 的 mime 类型。请注意,您可能必须为第二个参数传递 true,否则这些提示可能会被忽略(从查看源代码来看似乎如此)。

      这仍然取决于文件扩展名是否正确,即如果有人上传了包含其他内容的 .csv 文件,您将得到错误的 mime 类型。

      但是,JMimeMagic 似乎无论如何都不会做太多的内容检查。至少我在 sourceforge/github 找到的资源中没有找到太多东西。只有一个文本文件检测器,因此您可能需要为其他 mime 类型和文件格式添加自己的内容检测器。

      【讨论】:

      • 作为我的信息的旁注,Java Mime Magic 性能好吗?意味着它不会将整个文件保存在内存中并且只读取标题或初始内容并给出结果?如果我没有给出提示,可以在第二个参数中传递 false 吗?谢谢。
      • @Tahir 我不确定性能,但我想正在读取的文件部分取决于格式。我只能看到一个文本文件检测器,它似乎可以读取整个内容以查看其中是否有非文本字符。对于图像等其他格式,您可能必须提供自己的检测器并仅读取标题。不过,您也可以只依赖扩展名。请检查源/文档,我自己不使用该库,并且无法提供比我在其源中看到的更多信息。
      • @Tahir 至于第二个参数:如果你传递false,任何提示似乎都会被忽略,因此如果你不提供额外的提示,它实际上似乎并不重要。
      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 2015-02-08
      • 2013-11-10
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2019-01-03
      • 2015-12-15
      相关资源
      最近更新 更多