Java中,当表单含有文件上传时,提交数据的如何读取
当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过request.getParameter来获取用户提交的数据的。(说实话,我经常因为忘记这个问题而浪费好多调查时间。)
1.// 判断enctype属性是否为multipart/form-data
2.boolean isMultipart = ServletFileUpload.isMultipartContent(request);
3.
4.// Create a factory for disk-based file items
5.DiskFileItemFactory factory = new DiskFileItemFactory();
7.// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现
上传文件的保存
8.// 此方法是设置是否使用临时文件的临界值(单位:字节)
9.factory.setSizeThreshold(yourMaxMemorySize);
10.
11.// 与上一个结合使用,设置临时文件的路径(绝对路径)
12.factory.setRepository(yourTempDirectory);
13.
14.// Create a new file upload handler
15.ServletFileUpload upload = new ServletFileUpload(factory);
16.
17.// 设置上传内容的大小限制(单位:字节)
18.upload.setSizeMax(yourMaxRequestSize);
19.
20.// Parse the request
21.List> items = upload.parseRequest(request);
22.
23.Iterator iter = items.iterator();
24.while (iter.hasNext()) {
25.FileItem item = (FileItem) iter.next();
26.
27.if (item.isFormField()) {
28.//如果是普通表单字段
29.String name = item.getFieldName();
30.String value = item.getString();
31....
32.} else {
33.//如果是文件字段
34.String fieldName = item.getFieldName();
35.String fileName = item.getName();
36.String contentType = item.getContentType();
37.boolean isInMemory = item.isInMemory();
38.long sizeInBytes = item.getSize();
39....
41.// Process a file upload
42.if (writeToFile) {
43.File uploadedFile = new File(...);
44.item.write(uploadedFile);
45.} else {
46.InputStream uploadedStream = item.getInputStream();
47....
48.uploadedStream.close();
49.}
50.}
51.}
2. cos示例代码:
[java]view plaincopyprint?
1.// 设置大小限制(单位:字节)
2.final int permitedSize = 314572800;
3.
4.try {
5.String type = "";
6.String name = "";
7.String originalFilename = "";
8.String extension1 = "";
9.String extension2 = "";
10.String filename = "";
11.
12.//上传目录
13.String strDirectory = "files";
14.String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
15.
16.// 获取句柄
17.MultipartRequest multipartRequest = new MultipartRequest(request,
uploadPath,
18.permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());
19.
20.// 取得文件
21.Enumeration files = multipartRequest.getFileNames();
22.
23.// 取得文件详细信息
24.while (files.hasMoreElements()) {
https://www.sodocs.net/doc/5b5510854.html, = (String)files.nextElement();
26.type = multipartRequest.getContentType(name);
27.filename = multipartRequest.getFilesystemName(name);
28.originalFilename = multipartRequest.getOriginalFileName(name);
29.File currentFile = multipartRequest.getFile(name);
30....
31.}
32.
33.// 取得其它非文件字段
34.Enumeration params = multipartRequest.getParameterNames();
35.
36.while (params.hasMoreElements()) {
37.String name = (String)params.nextElement();
38.String value = multi.getParameter(name);
39....
40.}
41.} catch (Exception exception) {
42.response.sendError(response.SC_METHOD_NOT_ALLOWED);
43.} finally {
44.if (out != null) {out.close();}
45.}
3. SmartUpload示例代码:
[java]view plaincopyprint?
1.smartupload mysmartupload = new smartupload();
2.mysmartupload.initialize(this.getServletConfig(), request, response);
3.// 设置文件大小限制(单位:字节)
4.mysmartupload.setMaxFileSize(10000000);
5.// 设置总上传数据总大小(单位:字节)
6.mysmartupload.setTotalMaxFileSize(20000000);
7.// 设置允许的文件扩展名
8.mysmartupload.setAllowedFilesList("jpg,png,gif,bmp,jpeg");
9.// 设置不允许的文件扩展名
10.mysmartupload.setDeniedFilesList("exe,bat,jsp,htm,html,,");
11.
12.try {
13.mysmartupload.upload();
14.} catch (smartuploadException e1) {
15.e1.printStackTrace();
16.}
17.
18.// 读取其它非文件上传字段
https://www.sodocs.net/doc/5b5510854.html,.jspsmart.upload.Request req = mysmartupload.getRequest();
20.String title = req.getParameter("dest");
21.
22.// 保存文件
23.for (int i = 0; i < mysmartupload.getFiles().getCount(); i++) {
https://www.sodocs.net/doc/5b5510854.html,.jspsmart.upload.File file = mysmartupload.getFiles().getFile(i);
25.
26.if (file.isMissing()) continue;
27.
28.try {
29.file.saveAs("yourSavePath" + file.getFileName());
30.} catch (smartuploadException e) {
31.e.printStackTrace();
32.}
33.}
https://www.sodocs.net/doc/5b5510854.html,/lian_zhihui1984/article/details/6822201
Show一下我用HighCharts做的图表
三、进度图
四、曲线图
五、柱宽、X轴宽度固定的柱状态,源代码已经被我修改了。
https://www.sodocs.net/doc/5b5510854.html,/lishengbo/article/details/6124407#reply
用 Servlet 进行上载的原理和实现
李常庚(coid@https://www.sodocs.net/doc/5b5510854.html,), 自由撰稿人
简介: Servlet 是用 Java 编写的、协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于 Java 的服务器解决方案。使用 Servlet 可以方便地处理在 HTML 页面表单中提交的数据,但 Servlet 的 API 没有提供对以 mutilpart/form-data 形式编码的表单进行解码的支持,因而对日常应用中经常涉及到到文件上传等事务无能为力。本文将从文件传输的基本原理入手,分析如何用 Servlet 进行文件的上传,并提出解决方案。
发布日期: 2001 年 3 月 01 日
级别:初级
访问情况: 8099 次浏览
评论: (查看 | 添加评论 - 登录)
平均分(34个评分)
为本文评分
一、基本原理
通过 HTML上载文件的基本流程如下图所示。浏览器端提供了供用户选择提交内容的界面(通常是一个表单),在用户提交请求后,将文件数据和其他表单信息编码并上传至服务器端,服务器端(通常是一个 cgi程序)将上传的内容进行解码了,提取出 HTML表单中的信息,将文件数据存入磁盘或数据库。
回页首
二、各过程详解
A)填写表单并提交
通过表单提交数据的方法有两种,一种是 GET 方法,另一种是 POST方法,前者通常用于提交少量的数据,而在上传文件或大量数据时,应该选用 POST方法。在 HTML 代码中,在