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

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;
}
}

时间: 2025-01-11 09:49:00

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

【转】文件上传前预览

网上找到的一份文件上传前预览的代码,转自JavaScript 图片的上传前预览(兼容所有浏览器) <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <style type="text/css"> #preview, .img, img { w

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

文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.join('static/img', fafafa.name) with open(img.path, 'wb') as f: for item in fafafa.chunks(): f.write(item) function iframeSubmit(){ $('#ifm1').load(functi

js的FileReader实现图片文件上传、预览

js的FileReader实现图片文件上传.预览 FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件.使用Data URL的好处是,您不需要额外再发出一个HTTP 请求到服务器端取得额外的资料:而缺点便是,网页的大小可能会变大.它适合应用在内嵌小图片,不建议将大图像文件编码成Data URL来使用.您的图像文件不能够超过浏览器限定的大小,否则无法读取图像文件.1

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

CreateTime--2017年9月4日09:24:59 Author:Marydon 一.准备工作: 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转成JSON对象需要jar包:commons-beanutils-1.8.3.jar.commons-collections-3.2.1.jar.commons-lang-2.6.jar.commons-log

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

1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用,整合两者可以实现我们常规的Web数据导入操作,导入数据操作过程包括有上传文件,预览数据,选择并提交记录等一系列操作. 关于这个插件,我在早期随笔<Bootstrap文件上传插件File Input的使用>也做了一次介绍,这是一个增强的 HTML5 文件输入控件,是一个 Bootstrap 3.x

form里面文件上传并预览

其实form里面是不能嵌套form的,如果form里面有图片上传和其他input框,我们希望上传图片并预览图片,然后将其他input框填写完毕,再提交整个表单的话,有两种方式! 方式一:点击上传按钮的链接弹出上传页面,上传文件,上传完毕再返回表单页面:这种比较简单,其实就是表单页面的上传按钮仅仅是一个链接,仅用于打开上传文件的弹出页面: 方式二:就是表单里面有<input type="file" name="picture"/>,点击上传按钮后,会在上传

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

1.先准备一个div onchange触发事件 <input  type="file" onchange="preview(this)" ></span> <div id="preview"></div> 2.写JS代码 //上传图片之前预览图片function preview(file){ if (file.files && file.files[0]){ var reader =

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

首先需要导入一些js和css文件 <link href="__PUBLIC__/CSS/bootstrap.css" rel="stylesheet"> <link type="text/css" rel="stylesheet" href="__PUBLIC__/CSS/fileinput.css" /> <script type="text/javascript&

web端文件上传,预览,下载,删除

//HTML部分 <div class="item attachment attachmentNew"> <span class="name">附件</span> <span class="triggerUpLoad btnSpan" onclick="triggerUpLoadList(this)" v-show="operationType<2">&