使用commons-fileupload实现文件(doc、pdf)上传,提取表单参数并解决中文乱码

来源:互联网 发布:mac如何强制关机 编辑:程序博客网 时间:2024/06/05 15:41
文件上传利用commons-fileupload实现,笔者的SDK中包含这个包,没有这个包的童鞋,可以google之。

利用HTML表单:

<form name="add_document" action="../Servlet/DocServlet?opType=add" method="post" enctype="multipart/form-data">

向Servlet发送上传文件的请求,因为将enctype设置成"multipart/form-data",所以后台使用request.getParameter(para)无法提取参数的值。
只能通过FileItem类型获取表单中的元素,包括文件内容:

DiskFileItemFactory factory = new DiskFileItemFactory(); 
ServletFileUpload upload = new ServletFileUpload(factory);  
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem > iter = items.iterator();

通过对iter的遍历提取参数:

 FileItem fileItem = null;
 while (iter.hasNext()) { 
fileItem = iter.next();
if (fileItem.isFormField()) {
if(fileItem.getFieldName().equals("docuser")) {
username = fileItem.getString("gbk");
} else if (fileItem.getFieldName().equals("doctype")) {
docType = fileItem.getString("gbk");
} else if (fileItem.getFieldName().equals("docdepartment")) {
department = fileItem.getString("gbk");
 }
}else {
fileName = fileItem.getName();  
if (fileName != null) {
in = fileItem.getInputStream();
 }
 }
 } //while
上述代码中的:

isFormField()函数用来判断遍历到的元素是否是表单中的元素;
getFieldName()函数用来提取参数的名称;
getString()用来提取参数的值;
getInputStream()用来提取文件字节流。

当传递的参数为中文时,这就涉及到字符编码的问题了。本人网站采用的gbk进行编码,所以当使用getString()函数提取参数的值时,使用“gbk”作为参数,这样就解决了乱码的问题。