在我的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中获取图像......
这会改变我应该如何获取图像字节数组吗?
答案 0 :(得分:0)
您可以从资源中获取文件,然后像第一个有效的示例一样继续。似乎多余,但如果你能得到文件,那么你可以测试很多东西:
将文件写入磁盘并比较大小等
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;
}