springmvc 文件上传、下载、预览。以二进制形式存放到数据库。
数据库中的关于传入附件的字段我写了2个:一个存放内容accessory,一个存放文件的后缀filetype

上传:首先需要2个必须的jar:
commons.io-1.4.0.jar
commons.fileupload-1.2.0.jar

XXX-servlet.xml中写入上传拦截:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolve">  
      <property name="maxUploadSize" value="100000" />  
</bean>

jsp页面:
<form method="POST" action="提交地址" name="frm" enctype="multipart/form-data">   
       <input type="file" name="accessory"/><br>  
        <input type="submit" onclick="return checkacc();"/><br>  
</form>
<!--如果需要验证传入的文件的类型,可以通过js验证,我这个是在提交的时候验证的-->
<!--
function checkacc(){
    var postfix = frm.accessory.value.substring(frm.accessory.value.lastIndexOf(".")+1); //获得选择的上传文件的后缀名的正则表达式  
     if(postfix!=""){
          if(!(postfix == "jpg"||postfix == "pdf"))   
          {   
      alert('文件类型不正确,请选择.jpg或者.pdf文件 !');   
      document.getElementById('accessory').value="";
      document.getElementById('accessory').focus();
      return false;   
          }  
     } 
}
-->

注:在以前用servlet写的文件上传,加入enctype="multipart/form-data"这个字段,会造成获取不到form内其他字段的值,但在springmvc中不会出现这个问题。

java Controller类:
public ModelAndView addSaleStock(HttpServletRequest request,HttpServletResponse response) throws Exception {
       MultipartHttpServletRequest multipartRequest =(MultipartHttpServletRequest) request;
       MultipartFile file = multipartRequest.getFile("accessory");
       byte[] inputData = null;
       String fileType="";
       if(file!=null){
             inputData = inputStream2Byte(file.getInputStream());
             String s=file.getOriginalFilename();
             fileType=s.substring(s.lastIndexOf(".")+1);
                }        
                 //数据库中表的对象类(model),通俗说就是hibernate中的po
                 ValidRegstock validRegstock = new ValidRegstock();
                 validRegstock.setInputData(inputData);
                 validRegstock.setFiletype(fileType);
                      try {
                             //去看service类
            this.getBeanOfValidRegstockService().addSendRegStock(validRegstock);
           msg = "添加成功!";
             } catch (Exception e) {
           e.printStackTrace();
            msg = "添加失败!";
             }
                  return new ModelAndView(返回地址);
}

java service类:
public void addSendRegStock(ValidRegstock validRegstock)
throws Exception {
   //去看dao类
   regStockDao.add(validRegstock);
}

java  dao类:
public void add(ValidRegstock validRegstock) {
       String sql="insert into Z_ValidRegstock(accessory,filetype) values(?,?)";
       //这里我们用数据连接的形式存入数据库
       Connection conn=null;
       try {
conn = getJdbcTemplate().getDataSource().getConnection();
PreparedStatement ps=conn.prepareStatement(sql);
          //注意 :大对象类型的 我们存入的是bytes[],这里要set object
ps.setObject(1, validRegstock.getInputData());
ps.setString(2, validRegstock.getFiletype());
ps.executeUpdate();
conn.commit();
ps.close();
conn.close();
       } catch (SQLException e) {
e.printStackTrace();
       }
}

这样就能上传了。需要注意的是:

有些朋友会用:
Object[] params={validRegstock.getInputData()};
int[] dataTypes={Types.XXX};
getJdbcTemplate().update( sql, params, dataTypes);
这种方法存入,这里我之所以用了Types.XXX是因为 我试过Types.blob,Types.other等等都不好使。并且我把bytes[]用hibernate转为java.sql.blob的存入的话 也是不好使的。会出现类型不匹配java.oracle.blob.所以有用这种方法成功的朋友请告诉我。谢谢

预览和下载差不多。同一个service,同一个dao,我先给出dao和service:
java dao类:
public List accessorySel(String id){
StringBuffer sql=new StringBuffer("");
sql.append("select accessory,filetype from Z_ValidRegstock where regstockId='");
sql.append(id);
sql.append("'");
Connection conn=null;
statement state=null;
ResultSet rs = null;
List list=new ArrayList();
try {
    conn=getJdbcTemplate().getDataSource().getConnection();
    state=conn.createStatement();
    rs=state.executeQuery(sql.toString());
    if (rs.next()) {
                   //这个blob是java.sql.Blob类型的
Blob blob = rs.getBlob("accessory");
String filetype=rs.getString("filetype");
list.add(0, blob);
list.add(1,filetype);
    }
} catch (SQLException e) {
    e.printStackTrace();
          }
return list;
}

java service类:
public List accessorySel(String id){
return regStockDao.accessorySel(id);
}

java Controller类:
预览:
public ModelAndView getAccessoryView(HttpServletRequest request,HttpServletResponse response) throws Exception {
String id=request.getParameter("id");
List list=this.getBeanOfValidRegstockService().accessorySel(id);
Blob blob=(Blob) list.get(0);
String filetype=(String) list.get(1);
int length = (int) blob.length();
byte[] bImage = new byte[length];
InputStream is = new BufferedInputStream(blob.getBinaryStream());
is.read(bImage, 0, length);
OutputStream out = response.getOutputStream(); 
out.write(bImage);
out.flush(); 
out.close();
is.close();
return null;
}

下载:
public ModelAndView getAccessoryDownload(HttpServletRequest request,HttpServletResponse response) throws Exception {
         //jsp传过来的 要下载附件对应数据的id
String id=request.getParameter("id");
List list=this.getBeanOfValidRegstockService().accessorySel(id);
Blob blob=(Blob) list.get(0);
String filetype=(String) list.get(1);
OutputStream fos = response.getOutputStream();
InputStream is = new BufferedInputStream(blob.getBinaryStream());
          //如果下载的是表格形式的,可能会出现乱码。加入下面这句话:(其他出现乱码的情况自己百度下。)
response.setHeader("Content-Type","application/vnd.ms-excel");
//弹出保存框的语句,后面可以填入默认名称和类型
          response.setHeader("Content-Disposition","Attachment;filename=accessory."+filetype);
byte[] buffer = new byte[1024];
int size = 0;
while ((size = is.read(buffer)) != -1) {
      fos.write(buffer, 0, size);
}
      fos.flush();
      fos.close();
      return null;
}
}

springmvc 文件下传、上载、预览。以二进制形式存放到数据库(转载)的更多相关文章

  1. JavaScrip 原生多文件上传及预览 兼容多浏览器

    JavaScrip 原生多文件上传及预览 兼容多浏览器 html代码块 <div class="container"> <label>请选择一个图像文件:& ...

  2. form表单系列中文件上传及预览

    文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.j ...

  3. 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程

    1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...

  4. servlet实现文件上传,预览,下载和删除

      一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数 ...

  5. form里面文件上传并预览

    其实form里面是不能嵌套form的,如果form里面有图片上传和其他input框,我们希望上传图片并预览图片,然后将其他input框填写完毕,再提交整个表单的话,有两种方式! 方式一:点击上传按钮的 ...

  6. JQ图片文件上传之前预览功能

    1.先准备一个div onchange触发事件 <input  type="file" onchange="preview(this)" >< ...

  7. Django的文件上传以及预览、存储

    思路: 文件上传通过前端的input标签,input设置display:none属性. 内容显示需要让前端通过<img>标签读取图片内容,可以通过<label>标签连接< ...

  8. 支持多文件上传,预览,拖拽,基于bootstra的上传插件fileinput 的ajax异步上传

    首先需要导入一些js和css文件 <link href="__PUBLIC__/CSS/bootstrap.css" rel="stylesheet"&g ...

  9. 支持多文件上传,预览,拖拽,基于bootstrap的上传插件fileinput 的ajax异步上传(转载)

    首先需要导入一些js和css文件 <link href="__PUBLIC__/CSS/bootstrap.css" rel="stylesheet"&g ...

随机推荐

  1. CSS浮动属性Float介绍

    #cnblogs_post_body h6 {font-size: 16px;font-weight: bold;} 什么是CSS Float? float 是 css 的定位属性.在传统的印刷布局中 ...

  2. Express开发实例(1) —— Hello,world!

    Express是NodeJs开发中最常用的基础模块.NodeJs本身有Http模块,但是易用性并不好,因此有人在此基础上开发了Express模块. 什么是express express提供了丰富的路由 ...

  3. Linux下查看文件内容的命令

    查看文件内容的命令: cat     由第一行开始显示内容,并将所有内容输出 tac     从最后一行倒序显示内容,并将所有内容输出 more    根据窗口大小,一页一页的现实文件内容 less ...

  4. CentOS的SSH,Putty配置说明

    基本资源: CentOS5.5 (32位) , Mysql6.0 ,Putty ,SSH   Step: 1.VMWare中装好CentOS    A. 可能存在ifconfig等命令无法正常识别) ...

  5. Ubuntu 12 升级 SVN 1.6 到 1.8 版本

    在 Ubuntu 12 中使用 PhpStorm 10.x,CheckOut项目后,Event Log 提示: Subversion command line client version is to ...

  6. flexbox-CSS3弹性盒模型flexbox完整版教程

    原文链接:http://caibaojian.com/flexbox-guide.html flexbox-CSS3弹性盒模型flexbox完整版教程 A-A+ 前端博客•2014-05-08•前端开 ...

  7. thusc滚粗记

    day0 下午到了北京,雾霾还是那么大.. 到宾馆报个到,和哥哥吃了一波饭,去不起西郊...只能去五道口了... 晚上和wyz队长见面,wyz队长好帅啊...没带手机拍照真是个错误TAT day1 今 ...

  8. BZOJ4612——[Wf2016]Forever Young

    1.题意:将一个数y转化成b进制数,使得他>=l,且<y,且转化后均为0~9,使b最大. 2.分析:我们发现要么答案的b很小,要么y很小..那我们直接暴力枚举就好了啊 然后判断一下...另 ...

  9. Unity3D绑定button监听事件

    一.可视化创建及事件绑定 第一步:通过Hierarchy面板创建button,如图 第二步:创建一个脚本名为TestClick,并定义一个名为Click的public方法 ? 1 2 3 4 5 6 ...

  10. 分享一个快速设置背景的js 自动获取背景图的长宽

    我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...