Java中,当表单含有文件上传时,提交数据的如何读取

来源:互联网 发布:网络协议详解 编辑:程序博客网 时间:2024/06/01 08:07




当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过request.getParameter来获取用户提交的数据的。(说实话,我经常因为忘记这个问题而浪费好多调查时间。难过

这时候,当然可以通过解析提交到服务器的数据流来得到数据了,但是这样不但麻烦而且容易出错。

最好的方式是使用第三方的jar包获取数据,这方面有很多现成的成熟优秀的jar包。最常用的时以下三个:

apache的commons-fileupload : http://commons.apache.org/fileupload/

O'Reilly的cos: http://www.servlets.com/cos/index.html

jspsmart的SmartUpload:官方不提供下载了,google搜吧。

其中,据评测效率最高的是COS,最慢的是SmartUpload;最常用的是common-upload;文件太大时SmartUpland会崩溃。


1. common-upload示例代码:

// 判断enctype属性是否为multipart/form-databoolean isMultipart = ServletFileUpload.isMultipartContent(request);// Create a factory for disk-based file itemsDiskFileItemFactory factory = new DiskFileItemFactory();// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存// 此方法是设置是否使用临时文件的临界值(单位:字节)factory.setSizeThreshold(yourMaxMemorySize);// 与上一个结合使用,设置临时文件的路径(绝对路径)factory.setRepository(yourTempDirectory);// Create a new file upload handlerServletFileUpload upload = new ServletFileUpload(factory);// 设置上传内容的大小限制(单位:字节)upload.setSizeMax(yourMaxRequestSize);// Parse the requestList<?> items = upload.parseRequest(request);Iterator iter = items.iterator();while (iter.hasNext()) {    FileItem item = (FileItem) iter.next();    if (item.isFormField()) {    //如果是普通表单字段        String name = item.getFieldName();    String value = item.getString();    ...    } else {    //如果是文件字段        String fieldName = item.getFieldName();    String fileName = item.getName();    String contentType = item.getContentType();    boolean isInMemory = item.isInMemory();    long sizeInBytes = item.getSize();    ...        // Process a file uploadif (writeToFile) {    File uploadedFile = new File(...);    item.write(uploadedFile);} else {    InputStream uploadedStream = item.getInputStream();    ...    uploadedStream.close();}    }}


2. cos示例代码:

// 设置大小限制(单位:字节)final int permitedSize = 314572800;try {               String type = "";String name = "";String originalFilename = "";String extension1 = "";String extension2 = "";String filename = "";//上传目录String strDirectory = "files";String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");// 获取句柄MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,                  permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());         // 取得文件Enumeration files = multipartRequest.getFileNames();               // 取得文件详细信息 while (files.hasMoreElements()) {        name = (String)files.nextElement();       type = multipartRequest.getContentType(name);        filename = multipartRequest.getFilesystemName(name);        originalFilename = multipartRequest.getOriginalFileName(name);              File currentFile = multipartRequest.getFile(name);       ...}// 取得其它非文件字段Enumeration params = multipartRequest.getParameterNames();while (params.hasMoreElements()) {    String name = (String)params.nextElement();    String value = multi.getParameter(name);    ...}                      } catch (Exception exception) { response.sendError(response.SC_METHOD_NOT_ALLOWED);} finally { if (out != null) {out.close();} }


3. SmartUpload示例代码:

smartupload mysmartupload = new smartupload();mysmartupload.initialize(this.getServletConfig(), request, response);// 设置文件大小限制(单位:字节)mysmartupload.setMaxFileSize(10000000);           // 设置总上传数据总大小(单位:字节)mysmartupload.setTotalMaxFileSize(20000000);// 设置允许的文件扩展名mysmartupload.setAllowedFilesList("jpg,png,gif,bmp,jpeg");// 设置不允许的文件扩展名mysmartupload.setDeniedFilesList("exe,bat,jsp,htm,html,,");try {mysmartupload.upload();} catch (smartuploadException e1) {e1.printStackTrace();}// 读取其它非文件上传字段com.jspsmart.upload.Request req = mysmartupload.getRequest();String title = req.getParameter("dest");// 保存文件for (int i = 0; i < mysmartupload.getFiles().getCount(); i++) {com.jspsmart.upload.File file = mysmartupload.getFiles().getFile(i);if (file.isMissing()) continue;try {file.saveAs("yourSavePath" + file.getFileName());} catch (smartuploadException e) {e.printStackTrace();}}
转自:http://m.blog.csdn.net/article/details?id=6822201
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 合肥房子卖了户口没地方迁怎么办 忌作灶的日子新房装橱柜了怎么办 刮水泥浆的墙面刮不住腻子怎么办 小学二年级孩子偷钱 老师怎么办 发现自己读初中的儿子偷钱怎么办? 做错事了得不到亲人的原谅怎么办? 窗口 窗套与墙缝隙大怎么办 中班小孩还不会认1到10怎么办 母猫奶头被小猫咬伤了怎么办 口红不小心弄到衣服上怎么办 脖子后背疼的睡不着觉应该怎么办 君子兰用高锰酸钾泡浓度高了怎么办 五个月宝宝认人不要奶奶睡怎么办 幼儿小班安全卡鱼刺了怎么办教案 学籍在一年级学生在二年级怎么办 一岁多宝宝挑食不爱吃饭菜怎么办饭 换了新手机微信好友显示不全怎么办 朋友人在外地 联系不上怎么办 幼儿连字母都记不住该怎么办 车一边轮子掉农村路边小水沟怎么办 20个月小孩脾气急燥怎么办 给小孩上户口母亲是外国人怎么办 宝宝在学校不敢跟老师说话怎么办? 早教课上宝宝总爱乱跑怎么办? 20天大的宝宝4天不拉大便怎么办 还不会说话的小孩子脾气大怎么办 两岁的宝宝说话变的口吃怎么办 37周b超宝宝腿短怎么办 3岁的宝宝说话说不好怎么办 小儿说话晚的原因宝宝说话晚怎么办 22岁的儿子在家不说话怎么办 儿子2周4个月了不说话怎么办 三岁的宝宝还不会数数怎么办 2岁宝宝晚上不睡觉不听话怎么办 8个月的狗狗怕人不敢出门怎么办 狗太怕人了怎么办都不敢出门 媳妇和婆婆晚上都不想带孩子怎么办 婆婆和媳妇带孩子观念不一样怎么办 婆婆给媳妇买了不喜欢的家具怎么办 断奶后宝宝对奶粉很抗拒怎么办 两岁宝宝断奶不喝奶粉怎么办