以不同方式读取文件时,图像字节流不同

时间:2016-11-17 20:18:34

标签: java spring maven resources png

在我的Spring 4.3 / Maven 3.3项目中,我有一个图像文件,一个PNG文件,位于: 的src /主/资源/图像/ account.png

我有一个读取图像的util java应用程序文件,并将其写入数据库字段。代码如下:

private static String _accountFilename = "src/main/resources/images/account.png";

private byte[] getByteArrayFromFile(String filename)
{
    FileInputStream fileInputStream = null;

    File file = new File(filename);

    byte[] bFile = new byte[(int) file.length()];

    try
    {
        // convert file into array of bytes
        fileInputStream = new FileInputStream(file);
        fileInputStream.read(bFile);
        fileInputStream.close();

        for (int i = 0; i < bFile.length; i++)
        {
            System.out.print((char) bFile[i]);
        }

        System.out.println("Done");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return bFile;
}

public String getImageData(byte[] imageByteArray)
{
    Base64.Encoder encoder = Base64.getEncoder();

    String base64 = encoder.encodeToString(imageByteArray);
    base64 = "data:image/png;base64," + base64;
    return base64;
}

从&#34; getImageData&#34;返回的字符串效果很好。我可以将该String放在MySQL数据库的表中,并将该字段定义为TEXT。 我可以将base64编码数据拉回来,并显示图像。

现在,如果我从Spring Service而不是应用程序调用此代码,那么图像&#34; src / main / resources / images / account.png&#34;找不到。

在网上研究了一段时间之后,有很多很多例子来自&#34;资源&#34;其中许多对我不起作用。因为我在春天,我尝试了一些事情,最后这个工作:

@Value(value = "classpath:images/account.png")
private Resource defaultAccountImage;

private byte[] getByteArrayFromFile(Resource image)
{
    InputStream inputStream = null;

    byte[] bFile = null;

    try
    {
        bFile = new byte[(int) image.contentLength()];

        // convert file into array of bytes
        inputStream = image.getInputStream();
        inputStream.read(bFile);
        inputStream.close();

        for (int i = 0; i < bFile.length; i++)
        {
            System.out.print((char) bFile[i]);
        }

        System.out.println("Done");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return bFile;
}

private String getImageData(byte[] imageByteArray)
{
    Base64.Encoder encoder = Base64.getEncoder();
    String base64 = encoder.encodeToString(imageByteArray);
    base64 = "data:image/png;base64," + base64;
    return base64;
}

public String getDefaultAccountImage()
{
    byte[] accountImage = getByteArrayFromFile(defaultAccountImage);
    String fileString = getImageData(accountImage);
    return fileString;
}

当我查看第一种方式与独立java应用程序之间的字符串/图像数据,以及使用@Value和inputstream的第二种方式时,字符串数据中存在明显的不同。

字符串数据的一部分是相似的,但随后它发生了巨大变化,并且它们不匹配。因此,来自第二种方法的图像的文本数据不会显示为图像。

所以,我希望我能得到这个图像文本数据,它会是一样的,但事实并非如此。如果我可以使用我的web服务,它调用调用此ImageUtil代码的业务服务,我使用@Value获取图像资源并正确保存文本字符串,这将是很好的。

如果您有任何建议,我将非常感激。谢谢!

更新1: 这是一个多项目项目:

parent-project
      entity
      dao
      service
      ws

当我在服务层中运行我的测试代码时,建议的解决方案效果很好!找到图像并按原样加载字节字符串。然后我将代码编译成jar。

首先创建entity.jar。 dao.jar被创建并拉入entity.jar。 创建service.jar并拉入dao.jar。该图层还包含/resources/images/account.png文件。但是这个图像现在在罐子里。 ws.WAR文件会引入service.jar文件... 所以答案中的代码没有找到资源中的图像。 当我从ws层运行测试时,我得到一个FileNotFoundException。

所以...现在我正在研究如何从jar中获取图像......

这会改变我应该如何获取图像字节数组吗?

1 个答案:

答案 0 :(得分:0)

您可以从资源中获取文件,然后像第一个有效的示例一样继续。似乎多余,但如果你能得到文件,那么你可以测试很多东西:

  1. 将文件写入磁盘并检查内容
  2. 将文件写入磁盘并比较大小等

    import java.io.File;
    import java.io.FileInputStream;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.core.io.Resource;
    
    @Value(value = "classpath:images/account.png")
    private Resource defaultAccountImage;
    
    private byte[] getByteArrayFromFile(Resource image) {
    
        FileInputStream fileInputStream = null;
    
        byte[] bFile = null;
    
    
        try {
            File file = image.getFile();
            bFile = new byte[(int) file.length()];
    
            // convert file into array of bytes
            fileInputStream = new FileInputStream(file);
            fileInputStream.read(bFile);
            fileInputStream.close();
    
            for (int i = 0; i < bFile.length; i++) {
                System.out.print((char) bFile[i]);
            }
    
            System.out.println("Done");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bFile;
    }