现在的位置: 首页 > 综合 > 正文

commons-fileupload上传,获取上传页面普通表单域的值

2013年09月07日 ⁄ 综合 ⁄ 共 2853字 ⁄ 字号 评论关闭

哎,在工作中遇到的一个问题,最后还是通过csnd的帖子解决了,以下分享一下该帖,同时对发表此帖的人表示感谢!

转自:http://blog.csdn.net/y_ber/article/details/5678979

首先,要做文件上传的话就得先下载一个文件上传的组件,我用的是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.getName() = file(代表文件),

当item为普通的表单域时,

item.getFieldName() = file(代表文件)会得到此表单域的属性名,

例如: ,item.getFieldName() = "remk"。

item.getString()得到该表单域的值。

例如: ,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");

这样的话就不会有什么问题了。

抱歉!评论已关闭.