【问题标题】:Detecting mime-type of a MySQL BLOB in Java在 Java 中检测 MySQL BLOB 的 mime 类型
【发布时间】:2011-05-10 23:51:21
【问题描述】:

是的,我知道我们不应将图像存储在数据库中,谢谢。

也就是说,有没有办法在 java 中检测存储在 mysql 中的 BLOB 的 mime 类型?

它仅适用于图像(.gif、.png、.jpeg 等)。我不需要通用工具。

非常感谢大家

如果提出建议,则加分 解决方案不涉及第三方 库:)

【问题讨论】:

  • 没有理由不将图像存储在数据库中,也没有理由不使用 3rd 方库。至少有两个不错的,但我现在不记得他们的名字了。

标签: java mysql blob mime-types detection


【解决方案1】:

我想你可以看看标题。您需要将数据读入字节数组,然后检查字节以查看它们是否与不同文件类型的标头匹配。

例如,对于 GIF,前三个字节是“GIF”(4716 4916 4616),然后是"87a" (3816 3716 6116) 或 "89a" (3816 39 16 6116)。

所以这样的事情应该可以工作(使用FileInputStream 进行演示,但您可以使用ResultSet#getBinaryStream(int)ResultSet#getBinaryStream(String) 从BLOB 获取二进制数据):

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class IdentifyImage {
    public static void main(String[] args) throws IOException {
        FileInputStream in = null;

        try {
            in = new FileInputStream("sample.gif");

            //The following are in base 10
            byte[] gifHeader87a = {71, 73, 70, 56, 55, 97};
            byte[] gifHeader89a = {71, 73, 70, 56, 57, 97};

            byte[] bytes = new byte[6];
            in.read(bytes, 0, 6);

            if(Arrays.equals(gifHeader89a, bytes) || Arrays.equals(gifHeader87a, bytes)) {
               System.out.println("It's a GIF!");
            }

        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
}

您只需要在标头中查找其他文件类型(如 JPG、PNG 等)的字节。不确定这是否是最好的方法。有人可能有更好的解决方案。

就第 3 方库而言,jMimeMagic 相当不错。这可能是最简单的解决方案:)。

编辑

我在这里找到了this article,它列出了不同文件类型的标题信息。有一些示例代码,但它是用另一种语言 (Clarion) 编写的。

【讨论】:

    【解决方案2】:

    老实说,如果您记得始终可以使用缓存策略来避免某些问题,那么将图像存储在数据库中是没问题的。现代计算机往往能够处理大多数情况下的负载。无论如何,在存储 blob 时要记住的关键事项是在传入的过程中将 mimetype 与它一起存储,因为那时它往往很容易预测。

    【讨论】:

    • 别误会,这是一个合理的建议,但它根本不能回答问题。
    • 它可能有 -- 不清楚您是否仍处于可以解决此问题的设计阶段,或者您是否有大量数据需要为其映射 mime 类型。即使在这种情况下,我也宁愿离线运行一些东西来映射不变的 mimetype 并修改应用程序以预先获取它,而不是动态映射它,查找它可能会有点贵。
    【解决方案3】:

    我认为将二进制文件存储在数据库中并不是一个好主意,因为如果它长大了,它可能会很慢。

    即使您想这样做,我认为在存储二进制文件时最好存储 mime 类型。

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 2015-09-17
      • 2010-10-13
      • 2013-04-17
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      相关资源
      最近更新 更多