- 浏览: 177559 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
18335864773:
国产的软件PageOffice,本质上也是在客户端生成Exce ...
java 导出Excel 大数据量(一) -
zenmshuo:
从错误结果来看,应该是参数错误。我在用ActiveReport ...
jasper 子报表无法找到 -
longying2008:
是呀,恶心死人了,还天天发,天天上首页。
受不了那些打广告的了 -
endual:
前天晚上实在受不了,在它的某个广告下随口回了一句,跟他开始了无 ...
受不了那些打广告的了 -
西南吹风:
而且这人人品极其低劣。可称之为极品。他第一回发的时候,对他的作 ...
受不了那些打广告的了
群里的朋友无聊,于是出了题目大家一起做,原理很简单
用第三方jar包,commons-fileupload-1.2.2.jar,由于该jar依赖commons-io-2.0.1.jar,所以也加上这IO包
外加一个mysql数据库驱动jar,demo就用这3jar,
具体commons-fileupload-1.2.2.jar这个工具包怎么用,见apach官方网站 http://commons.apache.org/fileupload/using.html
上传处理主要是保存解析request及对解析后的对象进行流处理,所以,没有IO流操作基础的童鞋,可能存在一些困难。
在我这个demo中,流程是,
1、多个文件上传框,用户可以自由选择要上传的文件
2、点击上传后,在servlet中由fileupload去解析request,然后得到上传的文件封装对象FileItem和普通文本域(用UploadFile类封装了这两种类型的数据)
3、在servlet中进行其他操作,比如存数据、存硬盘、存硬盘并且讲文件在硬盘路径存数据库等。
4、上传成功跳转到下载页面。用户可对以往文件进行下载。
文件介绍:
1、UploadSvt 处理上传请求,处理上传数据等
2、UploadUtil上传工具类,主要是封装上传的文件对象和普通表单域对象
3、UploadFile由UploadUtil封装好的“上传的文件对象和普通表单域对象”存放到该类
4、DaoUtil处理数据库连接等系列数据
这里主要是贴几处重要的代码,
在实现流程2的时候,是在servlet中调用了一个UploadUtil工具类,用户解析request,并且封装成一个辅助实体对象UploadFile,然后在该servlet中进行其他的操作
UploadSvt 上传处理servlet:
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ @SuppressWarnings("unchecked") protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); UploadFile uploadFile = null; UploadUtil upbase = new UploadUtil(); try { uploadFile = upbase.parseRequest(request); } catch (Exception e) { e.printStackTrace(); if (e.getMessage() != null) { response.getWriter().write(e.toString()); response.getWriter().write("<a href='download.jsp'>下载</a>"); response.getWriter().write("<a href='index.jsp'>上传</a>"); response.getWriter().flush(); response.getWriter().close(); } return; } doSomething1(uploadFile); // doSomething2(uploadFile); // doSomething3(uploadFile); response.sendRedirect("download.jsp"); }
doSomething1、doSomething2、doSomething3分别是三处理类,用于实现各种需求,如存数据库,存硬盘等等,
下面是FileUtil工具类中的解析方法,
public UploadFile parseRequest(HttpServletRequest request) throws Exception { request.setCharacterEncoding("UTF-8"); // 判断是否为上传 if (ServletFileUpload.isMultipartContent(request)) { // 初始一个DiskFileItemFactory DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置临时存放目录 File file = new File(this.getClass().getResource( "/").getPath()); if(!file.exists() || !file.isDirectory()){ file.mkdirs(); } factory.setRepository(file); // 设置在案内存中的最大限度 factory.setSizeThreshold(UploadFile.SIZETHRESHOLD); ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大上传文件大小 upload.setSizeMax(UploadFile.SIZEMAX); List<FileItem> items = null; try { // 格式化 items = upload.parseRequest(request); } catch (Exception e) { e.printStackTrace(); if (e instanceof SizeLimitExceededException) { throw new Exception("ERROR:上传文件过大,文件最大:"+UploadFile.SIZEMAX/1024+"KB"); }else{ throw new Exception("解析请求错误"+e.getMessage()); } } // 取得item的迭代对象 Iterator<FileItem> iter = items.iterator(); UploadFile uploadFile = new UploadFile(); Map<String, Object> fields = uploadFile.getFields(); List<FileItem> files = uploadFile.getFiles(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String fieldName = new String(item.getFieldName().getBytes( "ISO-8859-1"), "UTF-8"); String fieldValue = new String(item.getString().getBytes( "ISO-8859-1"), "UTF-8"); if (fields.containsKey(fieldName)) { Object obj = fields.get(fieldName); if (obj instanceof List) { List<Object> ob = (List<Object>) obj; ob.add(fieldValue); } else { List<Object> list = new ArrayList<Object>(); list.add(obj); fields.remove(fieldName); fields.put(fieldName, list); } } else { fields.put(fieldName, fieldValue); } } else if (item.get() != null && item.get().length > 0) { files.add(item); } } request.setAttribute(UploadFile.REQATTRIBUTENAME, uploadFile); return uploadFile; } else { throw new Exception("ERROR:该请求不是上传文件 "); } }
还有一个UploadFile实现如下:用于封装解析request后的数据,
/** * fileuploadanddownload * UploadFile.java * @author lyjilu * date 2011-9-17 * @version 1.0 */ package com.lyjilu.model.entity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.fileupload.FileItem; /** * @author lyjilu * date 2011-9-17 * @version 1.0 * 上传文件对象,用于处理request时,封装上传对象几普通表单域 */ public class UploadFile { /** * 默认临时存储目录 */ public static final String TEMPREPOSITORY = "temp/"; /** * 在内存中的最大限度 */ public static final int SIZETHRESHOLD = 10000000; /** * */ public UploadFile() { } /** * 最大上传文件大小 */ public static final int SIZEMAX = 5024000; /** * 变量,永远在request.setAttribute的时候的键,方便统一取值 */ public static final String REQATTRIBUTENAME = "__UploadFile"; /** * 上传文件集合 */ private List<FileItem> files = new ArrayList<FileItem>(); /** * 文本 域数据集合 */ private Map<String, Object> fields = new HashMap<String, Object>(); public Map<String, Object> getFields() { return fields; } public void setFields(Map<String, Object> fields) { this.fields = fields; } public List<FileItem> getFiles() { return files; } public void setFiles(List<FileItem> files) { this.files = files; } }
demo重要的类基本就这些,还有个下载页面 其它都是简单jsp页面,
- fileupdownload.zip (3 MB)
- 下载次数: 27
发表评论
-
BouncyCastleProvider加密的时候千万别乱new BouncyCastleProvider 切记
2015-07-21 14:47 14465BouncyCastleProvider加密的时候千万别乱n ... -
jasper 打印 报错 net.sf.jasperreports.engine.JRRuntimeException: Subreport overflow
2015-03-09 16:49 3627详情列表中需要增加子报表,但总是报错 net.sf.ja ... -
IBM AIX 服务器 PBE解密 报错 Given final block not properly padded
2014-12-15 17:54 2860在各个客户服务器上运行好好的PBE加解密程序突然在一个用AIX ... -
工作备忘
2014-11-13 13:51 0表单页面布局和展示页面布局用不同的样式表,以便维护的时候,可 ... -
被中止,呼叫 getNextException 以取得原因
2014-09-12 17:38 8769批量插入数据报错, 批次处理 0 insert into ... -
java util date转换成js日期
2014-07-20 17:24 2560问题是这样的,javabean中标准date是使用java ... -
java 导出Excel 大数据量(二)
2014-06-20 17:50 8868导出大量数据到 excel 的 xlsx文件 stat ... -
java操作oracle clob字段
2014-06-17 11:19 1107问题是这样,系统中要对oracle数据库的clob字段进行插 ... -
自己实现的连接池,和dbcp居然有差点一倍的效率差距,不开心。。
2014-02-18 21:41 851自己写的数据库连接池,个人感觉良好,这两天测试才发现,效率那 ... -
java获取浏览器类型及版本
2013-12-27 10:25 8101public Map<String,String> ... -
request.getContextPath()为空
2013-12-02 10:30 6243request.getContextPath()获取的结果 ... -
取得java对象地址
2013-05-25 11:49 1279前段时间想打印出对象地址,但是由于list重写 了toStr ... -
spring 中使用web容器连接池不关闭连接
2013-05-15 09:43 3551如果方法上加 了“@Transactional”就能正常关 ... -
设置html文件响应头
2013-05-06 11:17 2441原写法: response.addHeader( ... -
jasper 子报表无法找到
2013-03-08 20:11 2746网上有这样的说法 主要原因: 主报表找不到子报表的Jas ... -
java 图片缩放(2)
2013-02-18 17:35 1416之前写过一个图片缩 ... -
spring 报错:Probable fatal error:No fonts found.
2013-01-02 23:43 2508lyjilu.iteye.com centos 6.2 网 ... -
css @IMPORT 不起作用
2012-12-09 00:15 2548今天遇见个问题,就是css里面用@IMPORT 包含进来的页面 ... -
浏览器刷新与缓存
2012-12-08 16:28 1433用谷歌浏览器测试,在设置了Cache-Control=max- ... -
java 导出Excel 大数据量(一)
2012-11-25 19:03 29516分析导出实现代码,XLSX支持: /** ...
相关推荐
Struts框架是Java Web开发中常用的一个开源MVC框架,由Apache软件基金会维护...以上是对Struts框架中文件上传下载功能的详细解析,希望对你理解这一主题有所帮助。如需进一步讨论,可以加入指定的QQ群或通过邮件联系。
js中除了现在用的textfield控件外,还有uploadfild可以支持extjs中文件的上传,但值得注意的是,form里的fileUpload属性必须为true, 前者支持IE和火狐 后者IE可以正常取得控件,而火狐不能,这点没有解决,并且在...
Servlet处理文件上传通常会使用Commons FileUpload库,它可以解析multipart/form-data格式的数据,处理每个上传的文件。为了防止恶意大文件上传,需要设置文件大小限制,同时确保文件类型的安全性。 最后,考虑到...
methodName类型的动态方法调用,也只能配置一个package 7./fileupload - 文件上传 <br>本资源来自QQ群:3038490,更多资源请访问http://blogxy.googlecode.com/svn/trunk/<br>由于依赖包很大就不放上来了,...
SpringMVC支持文件上传,可以集成Apache Commons FileUpload和Apache Commons IO库来处理文件上传逻辑。同时,AjaxFileupload组件可以用来实现文件上传功能,实现异步文件上传而不刷新页面。 电子邮件的发送功能在...