本文说的是把图片上传到数据库中的Blob类型,从数据库中取出来并显示的问题。框架是基于spring和mybatis的
首先环境配置,如果项目中有图片上传的功能。那么需要对应的JAR和相关配置。
1、commons-fileupload-1.2.2.jar
2、commons-io-2.0.1.jar
要实现SpringMVC的文件上传,需要配置一下文件:
其次,需要说明的是有图片上传提交的表单和没有图片上传提交的表单是不一样的。有图片上传的表单需要在form的设置中添加enctype="multipart/form-data"。例如: 。原因是enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作. enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功。
当然文件上传的JSP设置参照类型设置成file,自动就有参照按钮(不是所有,待定)了。
然后,先说上传图片,基本思路是把获得的文件转换成byte[]型然后存入数据库中。关于fle类型到byte[]型的转换,下面贴一下工具方法。需要用的可以直接复制。
public byte[] getBytes(File file){
byte[] buffer = null;
if (file == null){
return buffer;
} else {
try {
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return buffer;
}
由于mysql数据库中中Blob类型的字段其实就是二进制数据,所以可以当成是byte[].也就是表对应的Entity里的该字段的类型设为byte[]数组是没有任何问题。
之后贴一下mybatis的XML的SQL(说明一下,此处要提交的图片名称为logo)
update mcompany
set name = #{name,jdbcType=VARCHAR},
shortname = #{shortname,jdbcType=VARCHAR},
email = #{email,jdbcType=VARCHAR},
adress = #{adress,jdbcType=VARCHAR},
logo = #{logo,jdbcType=LONGVARBINARY},
where code = #{code,jdbcType=VARCHAR}
另外,由于本人在控制器里取表单传过来的文件的时候花了点时间,所以在此贴一下代码
@RequestMapping(value = "/save")
public String saveMyComDisplay(McompanyForm mcompanyForm,
@RequestParam("uploadfile") CommonsMultipartFile file) {
byte[] logoBytes = null;
if (!file.isEmpty()) {
try {
logoBytes = file.getBytes();
BufferedOutputStream stream =
new BufferedOutputStream(new FileOutputStream(new File("-uploaded")));
stream.write(logoBytes);
stream.close();
}catch (Exception e) {
return "You failed to upload => " + e.getMessage();
}
}
.......................此处省略.................................
}
其实图片上传还可以传到服务器的固定目录上,在数据库中保存的是图片地址。对于当个的小图片直接转换为二进制存在数据库中个人认为比较合适。
下面再来说图片显示的问题。基本思路是从数据库中取出该图片的byte[],之后转换成File类型的文件并保存到一个相对路径下的临时文件夹里面。JSP从该目录下面读取就可以了。
也贴一下byte[]转换为文件类型的工具方法,方便大家复制。
public static void byteToFile(byte[] buf, String filePath, String fileName)
{
BufferedOutputStream bufferOut = null;
FileOutputStream fileOut = null;
File file = null;
try
{
File resFile = new File(filePath);
if (!resFile.exists() && resFile.isDirectory())
{
resFile.mkdirs();
}
file = new File(filePath + File.separator + fileName);
fileOut = new FileOutputStream(file);
bufferOut = new BufferedOutputStream(fileOut);
bufferOut.write(buf);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (bufferOut != null)
{
try
{
bufferOut.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (fileOut != null)
{
try
{
fileOut.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
注意这个方法的目的是在你指定的目录下面新建将数据库存的Blob类型的转换后的一个文件。无返回值。其中参数新建文件的路径,一般情况下为相对路径。
最后贴一下JSP中显示图片的代码
总得来说,这是图片上传比较基本的方法,不适用于上传大批量文件的情况。