图片上传及显示
来源:互联网 发布:java中的string是什么 编辑:程序博客网 时间:2024/05/16 01:14
本文说的是把图片上传到数据库中的Blob类型,从数据库中取出来并显示的问题。框架是基于springMVC和mybatis的,数据库是mysql。
1、commons-fileupload-1.2.2.jar 2、commons-io-2.0.1.jar
其次,需要说明的是有图片上传提交的表单和没有图片上传提交的表单是不一样的。有图片上传的表单需要在form的设置中添加enctype="multipart/form-data"。原因是 enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个Form表单的编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行后面的操作。enctype="multipart/form-data"是上传二进制数据,即将form里面input的值以2进制的方式传过去,所以request就得不到值了。 也就是说添加了这段代码,用request就会传递不成功。
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; }
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[]转换为文件类型的工具方法,方便大家复制。 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(); } } } }
首先环境配置,如果项目中有图片上传的功能。那么需要对应的JAR和相关配置。
要实现SpringMVC的文件上传,需要配置一下xml文件:
在JSP中将文件上传字段的type设置成"file",自动就有参照按钮(不是所有,待定)了。
然后,先说上传图片,基本思路是把获得的文件转换成byte[]型然后存入数据库中。关于fle类型到byte[]型的转换,下面贴一下工具方法。需要用的可以直接复制。
由于mysql数据库中Blob类型的字段其实就是二进制数据,所以可以当成是byte[]。也就是表对应的Entity里的该字段的类型设为byte[]数组是没有任何问题。
之后贴一下mybatis的XML的SQL(说明一下,此处要提交的图片名称为logo)
另外,由于本人在控制器里取表单传过来的文件的时候花了点时间,所以在此贴一下代码
其实图片上传还可以传到服务器的固定目录上,在数据库中仅保存的是图片地址。但对于单个的小图片直接转换为二进制存在数据库中比较合适。
下面再来说图片显示的问题。基本思路是从数据库中取出该图片的byte[],之后转换成File类型的文件并保存到一个服务器的相对路径下的临时文件夹里面。JSP从该目录下面读取就可以了。
注意这个方法的目的是在你指定的目录下面新建将数据库存的Blob类型的转换后的一个文件。无返回值。其中参数新建文件的路径,一般情况下为相对路径。
最后贴一下JSP中显示图片的代码
总得来说,这是图片上传比较基本的方法,不适用于上传大批量文件的情况。上传大量文件的情况通常会报异常,后面还有介绍关于不直接保存文件而是保存文件路径的方法。后面的方法更常用些。
0 0
- 图片上传及显示
- 图片上传及显示
- 上传图片存入sql及显示
- 上传图片到数据库及显示
- php图片上传及显示(原创)
- Retrofit图片上传及进度的显示
- React-Quill中的图片上传及显示
- android上传图片及下载图片并显示
- SSH纪实--上传图片及本地图片显示
- ueditor 编辑器,自定义图片上传及图片显示
- 图片文件上传入SQL库及显示代码
- SSH+SQLServer2005图片文件上传及页面显示
- jQuery + ashx 实现图片按比例预览、异步上传及显示
- Spring文件上传下载and图片上传及前台显示
- nodejs+express+ajax实现图片上传及显示
- 使用Dropzone上传图片及回显示例
- ruby on rails爬坑(三):图片上传及显示
- Struts2文件(图片)上传及页面显示
- LaTex 插入图片技巧
- elk报错,显示linux文件数打开过多
- [干货分享]【云栖大会分享Day】赏四大美女,抢虚机、邮箱开通码~
- Swift - 使用ijkplayer框架播放直播视频1(RTMP/HTTP视频流播放)
- js常用函数和语法大全
- 图片上传及显示
- uva1339古老的密码
- Python数据分析-1
- Tech Insight:一个初创论坛的一票难求
- 微信小程序把玩(二十六)navigator组件
- 微信小程序的小结
- 不是你不会做菜,你只是缺个好厨房:深谈御膳房架构演进
- Flume-og和Flume-ng的变化
- doc打包命令