commons-fileupload上传,获取上传页面普通表单域的值
今天刚做了个文件上传功能,遇到了一些问题,不过现在都解决了。在这里我想把我知道的和大家分享下,希望对大家有帮助。首先,要做文件上传的话就得先下载一个文件上传的组件,我用的是commons-fileupload。当然还有其它的组件,自己喜欢用哪个就用哪个吧。我用的插件:http://liukai135.ys168.com/?jdfwkey=ilrfp,或者到这里面去下载http://commons.apache.org/fileupload/。上传需要下面这两个包:commons-fileupload-1.1.1.jar和commons-io-1.2.jar。把它们放到你工程的lib目录下面就可以使用了。
然后,写一个方法或类,下面的代码为上传的核心代码块:
//检查表单是否正确
boolean isMultipart = FileUpload.isMultipartContent(request);
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//文件最大,设为-1表示不受限制
upload.setSizeMax(4096);
//解析请求,把解析的结果放在一个List里面
List items = upload.parseRequest(request);
//缓存大小,设为-1表示不受限制
factory.setSizeThreshold(4096);
//设置临时目录
factory.setRepository(new File("D:\\temp"));
Iterator iter = items.iterator();
while( iter.hasNext() ){
FileItem item = (FileItem)iter.next();
//检查是一个普通的表单域还是File组件
if( !item.isFormField() ){
System.out.println("FileName:==>"+item.getName());
System.out.println("FieldName:==>"+item.getFieldName());
System.out.println("Size:==>"+item.getSize());
//item.getName 返回的是完整的文件名,如:E:\\xx\11.doc
//所以这里用一个fullFile来取文件名
File fullFile = new File(item.getName());
File uploadedFile = new File("D:\\ftp\\",fullFile.getName());
item.write(uploadedFile);
}
}
注释写的很清楚,我就不多解释了。
其中:item.getName()是得到上传文件的物理路径+文件名。
item.getFieldName()是得到表单域的类型,当item为上传文件表单域时,item.getFieldName() = file(代表文件),当item为普通的表单域时,item.getFieldName() = file(代表文件) 会得到此表单域的属性名,例如:<input id="remk" name="remk" type="text" value="" />,item.getFieldName() = "remk"。
item.getString()得到该表单域的值。例如:<input id="remk" name="remk" type="text" value="dddddddddd" />,item.get.String() = "dddddddddd"。
item.getSize()表示该上传文件或表单域值的大小。
item.isFormField() :判断该item是否为普通表单域。
看了上面的内容之后,你应该知道怎么或得普通表单域的值了吧,用request.getParameter("remk")肯定不会获得值,因为上传页面的from表单是用二进制流的方式上传的,所以用普通的方法根本得不到它的值的。解决方法如下:
//检查表单是否正确
boolean isMultipart = FileUpload.isMultipartContent(request);
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//文件最大,设为-1表示不受限制
upload.setSizeMax(4096);
//解析请求,把解析的结果放在一个List里面
List items = upload.parseRequest(request);
//缓存大小,设为-1表示不受限制
factory.setSizeThreshold(4096);
//设置临时目录
factory.setRepository(new File("D:\\temp"));
Iterator iter = items.iterator();
while( iter.hasNext() ){
FileItem item = (FileItem)iter.next();
//检查是一个普通的表单域还是File组件
if( !item.isFormField() ){
System.out.println("FileName:==>"+item.getName());
System.out.println("FieldName:==>"+item.getFieldName());
System.out.println("Size:==>"+item.getSize());
//item.getName 返回的是完整的文件名,如:E:\\xx\11.doc
//所以这里用一个fullFile来取文件名
File fullFile = new File(item.getName());
File uploadedFile = new File("D:\\ftp\\",fullFile.getName());
item.write(uploadedFile);
}else{
String remk = item.getString();//获得普通表单域的值。
}
}
我在这只是考虑有一个文件上传域和一个普通域的情况。如果有多个普通域的话就得:
else{
if("remk".equals(item.getName()){
String remk = item.getString();
}
if("descript".equals(item.getName()){
String descript = item.getString();
}
}
这样得到的值,如果有汉字的话就会有乱码。所以要转一下编码:
String remk = new String(item.getString().getBytes("iso-8859-1"),"UTF-8");
这样的话就不会有什么问题