哎,在工作中遇到的一个问题,最后还是通过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");
这样的话就不会有什么问题了。