java获取表单文件大小_Java中,当表单含有文件上传时,提交数据的如何读取

在Java中,当表单提交包含文件时,不能直接使用request.getParameter获取数据。推荐使用ServletFileUpload、cos或SmartUpload等库来处理。示例代码分别展示了这三个库的使用方法,包括设置大小限制、读取文件信息和保存上传文件。
摘要由CSDN通过智能技术生成

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

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

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

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();

}

}

}

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 

com.jspsmart.upload.File file = mysmartupload.getFiles().getFile(i);

if (file.isMissing()) continue;

try {

file.saveAs("yourSavePath" + file.getFileName());

} catch (smartuploadException e) {

e.printStackTrace();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值