`

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;
}
}
3
1
分享到:
评论
1 楼 D大调卡农 2012-04-23  
博主好人啊,给力 赞一个

相关推荐

    springMvc+Oracle的图片转二进制流

    当涉及到图片处理时,有时需要将图片转换为二进制流,以便于在数据库中存储和检索。以下将详细讲解如何在Spring MVC和Oracle环境中实现这一过程。 首先,我们需要理解图片转二进制流的概念。在计算机系统中,图片...

    springmvc上传下载并且保存到数据库

    在本项目"springmvc上传下载并且保存到数据库"中,我们将探讨如何利用 Spring MVC 实现文件的上传与下载功能,并将相关信息存储到数据库。 1. **文件上传** - **CommonsMultipartFile**:在 Spring MVC 中,我们...

    SpringMVC文件上传,多文件上传实例

    在这个“SpringMVC文件上传,多文件上传实例”中,我们将深入探讨如何在SpringMVC环境中实现文件上传功能,包括单个文件上传以及多个文件的批量上传。 1. **文件上传原理**: 文件上传是通过HTTP协议的POST请求来...

    JavaEE企业级开发-----SpringMVC实现 文件的上传下载实验报告.docx

    在JavaEE企业级开发中,SpringMVC框架是广泛用于构建Web应用程序的工具,它提供了丰富的功能,包括处理文件上传和下载。本实验报告将详细阐述如何利用SpringMVC实现文件上传与下载的功能。 首先,文件上传的核心...

    基于springmvc实现文件上传下载 基于AOP的日志功能

    基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...

    SpringMVC框架实现文件的上传和下载

    这里设置了响应的类型为二进制流,以适应各种类型的文件,并设置`Content-Disposition`头来告诉浏览器以附件形式下载。 2. **安全考虑** 文件下载时应确保文件路径的安全性,避免路径遍历攻击。此外,还可以考虑...

    springMvc单文件多文件上传

    springMvc 文件上传,springMvc 支持单文件和多文件上传,

    SpringMvc上传本地图片保存数据库并实时显示

    在Spring MVC框架中,处理本地图片的上传、存储到数据库以及实时显示是一个常见的需求。这个过程涉及多个步骤,包括前端表单设计、后端控制器处理、文件上传逻辑、数据库操作以及视图展示。下面我们将详细讲解这个...

    SpringMVC文件上传和下载的工具类(完整项目)

    本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中。开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成类。

    SpringMVC文件上传Demo代码

    在SpringMVC中实现文件上传是一项常见的任务,它允许用户通过表单将本地文件发送到服务器进行存储或处理。这个"SpringMVC文件上传Demo代码"是一个实例,演示了如何配置和使用SpringMVC来实现这一功能。 首先,我们...

    SpringMVC单文件上传、多文件上传、文件列表显示、文件下载

    本文将详细讲解如何实现SpringMVC中的单文件上传、多文件上传、文件列表显示以及文件下载。 首先,我们需要理解SpringMVC处理文件上传的基本原理。在SpringMVC中,文件上传通常涉及到`CommonsMultipartResolver`...

    springMVC上传文件.zip_springmvc_上传文件_文件上传

    SpringMVC是一个强大的Java web开发框架,由Spring公司...在实际项目中,可能还需要集成其他功能,如文件预览、下载、删除等,以满足更复杂的需求。了解并掌握这些知识点,对于提升SpringMVC应用的开发能力至关重要。

    SpringMVC文件增删改查(上传、更新、下载、删除)

    在SpringMVC框架中,文件操作是常见的功能需求,包括文件的上传、下载、更新和删除。本项目提供了完整的解决方案,覆盖了这些功能点。以下将详细解释这些知识点。 一、文件上传 在SpringMVC中,文件上传主要依赖于`...

    springMVC上传下载样例

    只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。 一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析...

    SSM(Spring+SpringMvc+Mybatis)图片上传保存到数据库与回显+sql

    在这个项目中,我们主要关注的是如何在SSM框架下实现图片上传并将其信息存储到数据库,以及如何将已存储的图片信息回显出来。 首先,`Spring`作为核心容器,负责管理应用中的所有Bean,提供依赖注入(Dependency ...

    springmvc文件上传所需jar包

    com.springsource.org.apache.commons.fileupload-1.2.0.jar com.springsource.org.apache.commons.io-1.4.0.jar

    SpringMVC文件上传案例

    在SpringMVC框架中,文件上传是一个常见的功能,它允许用户通过Web应用程序上传文件到服务器。这个"SpringMVC文件上传案例"展示了如何在Eclipse开发环境中实现这一过程。下面我们将详细探讨涉及的知识点。 首先,...

    SpringMVC上传文件 SSH上传文件

    本主题将深入探讨如何使用SpringMVC和SSH(Struts2 + Hibernate + Spring)框架来实现文件的上传与下载。 首先,我们来看SpringMVC中的文件上传。SpringMVC是Spring框架的一部分,它提供了强大的MVC设计模式支持,...

    SSM整合包 spring+springMVC+Mybatis+bootstarp以及文件上传与下载

    在这个整合包中,我们还将探讨如何结合Bootstrap来实现前端界面的快速开发,并学习文件上传与下载的功能。 1. **Spring框架**:Spring是Java企业级应用的核心框架,它提供了依赖注入(DI)和面向切面编程(AOP)等...

Global site tag (gtag.js) - Google Analytics