环境:Spring+Struts1.0+Hibernate 数据库:Oracle
功能:上传文件并储存未Oracle blob大字段,下载大字段到本地
control:
/*
使用common-fileupload包
*/
ServletFileUpload fileUpload=new ServletFileUpload();
FileItemIterator items=fileUpload.getItemIterator(req);
while(items.hasNext()){
FileItemStream item=items.next();
InputStream stream=item.openStream();//输入流
String name=item.getFieldName();
if(item.isFormField()){
String value=Streams.asString(stream,"gbk");//如果是表单的元素,放进session里
req.getSession().setAttribute(name, value);
}
else{
InputStream is=stream;
//BufferedReader r=new BufferedReader(new InputStreamReader(is,"gbk"));
//获得链接传过来的参数
String employeeid = req.getParameter("employeeid").toString();//cmd.getEmployee().getEmployeeid();
Resumefile resumefile = new Resumefile();
Employeebank employeebank = employeeService
.selectEmployeeById(employeeid);
resumefile.setEmployeebank(employeebank);
resumefile.setEmployeeid(employeeid);
resumefile.setFilesuffix(item.getName());
resumefile.setFilestore(Hibernate.createBlob(is));//将输入流转换为大对象
employeeService.saveResumefile(resumefile);
is.close();
stream.close();
前台:
<form action="" id="addForm" enctype="MULTIPART/FORM-DATA" method="post">
<div style="text-align:left;PADDING-LEFT: 15px">
。。。
<table>
<tr>
<td><input type="file" id="normal" name="inputFile" /></td>
</tr>
。。。
</table>
</form>
其他不重要的省略
下载:
control:
Resumefile resumefile = new Resumefile();
resumefile.setEmployeeid(employeeid);
resumefile = employeeService.getResumefile(employeeid);
res.setHeader("Pragma","No-cache");
res.setHeader("Cache-Control","no-cache");
res.setDateHeader("Expires", 0);
res.setContentType("application/x-msdownload"); //这句最重要,自动弹出要下载的路径
//res.setContentType("application/OCTET-STREAM;charset=UTF-8");
res.setHeader("Content-Disposition", "attachment;filename="+java.net.URLEncoder.encode(resumefile.getFilesuffix(),"utf-8") );//解决弹出框乱码的问题
Blob blob = resumefile.getFilestore();//获得大字段
InputStream is = blob.getBinaryStream();
OutputStream outs=new BufferedOutputStream(res.getOutputStream());
int b;
byte[] buffer = new byte[1024*1024]; //这里可以更灵活点
while((b = is.read(buffer)) != -1){
outs.write(buffer);
}
is.close();
outs.flush();
outs.close();
res.flushBuffer(); //记得要关闭流,否则有可能报错,respons输出流已被调用,注意:该方法没有返回值!!
前台:给个链接就行
先记下来,怕忘了,原理还没弄懂