由于工作原因,碰到file与其他表单同时提交的问题,研究了几天,加上google的帮助,终于成功了。下面就分享一下:
1、提交的表单必须写enctype="multipart/form-data",但是在很多情况下,可能不能确定是不是一定会有文件,这时修改,表单提交前,就是使用javascript动态控制.如下:
function setEncoding(form){
//filterForm.encoding="";
var hasFile = false;
var inputTags = document.getElementsByTagName("input");
for(i=0;i<inputTags.length;i++){
if(inputTags[i].type=="file"){
form.encoding = "multipart/form-data";
hasFile = true;
break;
}
}
return hasFile;
}
2、fileuploader.java
package com.neusoft.report.engine.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploader {
private List items;
private Map params=new HashMap();
public void parseParams(HttpServletRequest request) {
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();//文件解析失败,请确认form中的文件正确并且form的enctype属性为multipart/form-data
}
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
System.out.println(name+","+value);
if(params.containsKey(name)){
value = ((String)params.get(name))+","+value;
}
params.put(name, value);
}else{
String name = item.getFieldName();
byte[] fileBytes = item.get();//把文件解析成字节数组保存,当然也可以上传到临时文件夹。
params.put(name, fileBytes);
}
}
}
/*
* 从params中取
*/
public String getParameter(String name){
String value = null;
if(params.containsKey(name)){
value = (String)params.get(name);
if(value==null||value.equalsIgnoreCase("null"))
value=null;
}
return value;
}
public String[] getParameterValues(String name){
String[] values = null;
if(params.containsKey(name)){
values = ((String)params.get(name)).split(",");
}
return values;
}
public byte[] getFileParameter(String name){
byte[] fileBytes=null;
if(params.containsKey(name)){
fileBytes = (byte[])params.get(name);
}
return fileBytes;
}
/*
* 如params中没有,从request中取
*/
public String getParameter(HttpServletRequest request,String name){
String value = null;
if(params.containsKey(name)){
value = (String)params.get(name);
if(value==null||value.equalsIgnoreCase("null"))
value=null;
}else{
value = request.getParameter(name);
}
return value;
}
public String[] getParameterValues(HttpServletRequest request,String name){
String[] values = null;
if(params.containsKey(name)){
values = ((String)params.get(name)).split(",");
}else{
values = request.getParameterValues(name);
}
return values;
}
}
3、Action中的使用方法:
String hasFile = request.getParameter("hasFile");
if (hasFile == null) {
hasFile = "";
}
if (hasFile.equalsIgnoreCase("true")) {
uploader = new FileUploader();
uploader.parseParams(request);
String name = uploader.getParameter(request, "name");
type = uploader.getParameter(request, "ctype");// 报表结点类型(type=1)还是结果结点类型(type=3)
} else {
name = request.getParameter("name");
}