Java中,当表单含有文件上传时,提交数据的如何读取
来源:互联网 发布:中信证券 软件 编辑:程序博客网 时间:2024/05/18 03:31
当提交表单里包含文件上传的时候,即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-data
- boolean isMultipart = ServletFileUpload.isMultipartContent(request);
- // Create a factory for disk-based file items
- DiskFileItemFactory factory = new DiskFileItemFactory();
- // 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
- // 此方法是设置是否使用临时文件的临界值(单位:字节)
- factory.setSizeThreshold(yourMaxMemorySize);
- // 与上一个结合使用,设置临时文件的路径(绝对路径)
- factory.setRepository(yourTempDirectory);
- // Create a new file upload handler
- ServletFileUpload upload = new ServletFileUpload(factory);
- // 设置上传内容的大小限制(单位:字节)
- upload.setSizeMax(yourMaxRequestSize);
- // Parse the request
- List<?> 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 upload
- if (writeToFile) {
- File uploadedFile = new File(...);
- item.write(uploadedFile);
- } else {
- InputStream uploadedStream = item.getInputStream();
- ...
- uploadedStream.close();
- }
- }
- }
// 判断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();}
- }
// 设置大小限制(单位:字节)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://blog.csdn.net/lian_zhihui1984/article/details/6822201
- Java中,当表单含有文件上传时,提交数据的如何读取
- Java web中,当表单含有文件上传时,提交数据的如何读取
- Java中,当表单含有文件上传时,提交数据的如何读取
- Java中,当表单含有文件上传时,提交数据的如何读取
- Java中,当表单含有文件上传时,提交数据的如何读取 .
- Java中,当表单含有文件上传时,提交数据的如何读取
- Java中,当表单含有文件上传时,提交数据的如何读取(吐血版)
- Java中,当表单含有文件上传时,提交数据的如何读取
- Java中,当表单含有文件上传时,提交数据的如何读取(感谢作者分享)
- Java中,当表单含有文件上传时,提交数据的如何读取
- Java中,当表单含有文件上传时,提交数据的如何读取
- Java web中,当表单含有文件…
- ajax异步提交含有文件的表单
- springmvc使用实体类接收表单提交数据中含有String类型对应Date类型的不匹配报错400时如何处理
- 用jquery.form.js 实现ajax提交含有上传文件和普通字段的表单
- html5里使用ajax提交含有上传文件的form表单
- 用java模拟html表单(form)提交数据包含多文件上传表单提交。
- ajax中form表单中含有文件上传功能,后台语言是java,包括图片的下载,预览,删除
- 第二章数据类型和表达式--项目2求两点间的距离
- on、where、having的区别
- 论PHP中最完美扩展名获取方法
- GCDiscreetNotificationView提示视图
- SQLsever2008 远程连接错误 linq
- Java中,当表单含有文件上传时,提交数据的如何读取
- Wireshark抓包工具使用教程以及常用抓包规则
- java编程思想笔记--多态部分三
- A Painless Q-learning Tutorial (一个 Q-learning 算法的简明教程)
- log4j入门(转)
- NDK开发学习记录
- json封装,获取数据
- http与https的区别
- DNN与微软同声传译系统背后的故事