Java Web工程中数次遇到的问题:在提交表单时,如果提交的表单既有文件(图片、文件、rar压缩包等),也有普通文本信息,表单的提交方式enctype="multipart/form-data",就会导致上传的普通文本信息乱码。
解决方案:
在获取Jsp页面传来的数据后,将Fileitem中的文件和普通文本信息分开处理。
处理后将文件先放置于临时存储空间;
对普通文本信息进行转码UTF-8,就是获取到item中的字符串内容,以utf8形式。
String value = item.getString("UTF-8");
部分代码如下
//处理表单信息,图片的上传
//获得磁盘文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//获取上传路径
String path = request.getRealPath("/upload");
//先将文件放置于临时存储空间里
//最终通过流的形式将文件写到瓷盘里
factory.setRepository(new File(path));
//设置文件大小
factory.setSizeThreshold(1024*1024);
//使用api进行文件上传处理
ServletFileUpload upload = new ServletFileUpload(factory);
//处理多文件上传
OutputStream os = null;
InputStream in = null;
try {
List<FileItem> list = upload.parseRequest(request);
//遍历集合
for (FileItem item : list) {
//获取表单中的属性的名字
String name = item.getFieldName();
//判断是否为表单的普通文本信息
if(item.isFormField()){
//获取abc这样的字符串
//问题:将普通文本信息和图片分开处理后,普通文本信息乱码
//解决方案: 在此处getString方法中追加编码格式
String value = item.getString("UTF-8");
//存储
request.setAttribute(name, value);
}else{
//处理非文本类型数据类似图片,pdf,rar等等
//分三步走
//1.获取路径名
String value = item.getName();
//d:\\test\\hehe.jgp
//2.处理反斜杠
int start = value.lastIndexOf("\\");
//得到文件名,去除反斜杠前面的内容
filename = value.substring(start+1);
request.setAttribute(name, value);
//3.准备写入
//上传需要读写流
os = new FileOutputStream(new File(path,filename));
in = item.getInputStream();
int length = 0;
byte [] buf = new byte[1024];
while((length=in.read(buf))!=-1){
os.write(buf, 0, length);
}
in.close();
os.close();
}//for结尾
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}