最近一个面试说是准备一个增删改查,一个网友跟我说加上文件上传,于是我就在以前做的一个商品模块的的添加商品那个操作中加上文件上传。我用的是jsp的文件上传的标签,用的是fileupload上传组件,当我提交的时候发现我的到的参数都是空的,后来查资料才知道,用这个组件上传文件,是不能通过普通到了方式得到提交的参数的,下面是我给我你改后的代码,才是通过了,嘿嘿很高兴做一分享一下:
public ActionForward addProduct(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ActionForward forward = null;
try {
//通过普通的方式的不到参数
/*String name = request.getParameter("textfield");
String images ="imges/"+ request.getParameter("textfield6");
System.out.println(images+"-----------------");
String basePrice = request.getParameter("textfield4");
String descriptions = request
.getParameter("txt_article_class_description");
String product_addTime = request.getParameter("textfield9");
String procider = request.getParameter("provider_name");
String category = request.getParameter("product_type");*/
//以文件上传的方式得到参数
String id = request.getParameter("ids");
Map<String,String> map =new HashMap<String, String>();//用于存放文本域中的参数
DefaultFileItemFactory factory = new DefaultFileItemFactory();
ServletFileUpload fileUp = new ServletFileUpload(factory);//获取文件上传的对象
fileUp.setFileItemFactory(factory);
fileUp.setSizeMax(1000 * 100);//设置文件上传的最大限制
String t_name = null;
try{
List<FileItem> items = fileUp.parseRequest(request);
System.out.println(items+"------------");
FileItem fileItem = null;
Iterator<FileItem > it= items.iterator();
while (it.hasNext()){
FileItem item = it.next();
//判断是否是文件域
if(item.isFormField()){
String filename = item.getFieldName();//得到参数的名字
String value = item.getString("utf-8");//得到参数的值
map.put(filename, value);//放入到map集合中
}else{
fileItem = item;
}
}
String path = null;
path= this.getServlet().getServletContext().getRealPath("/images");//设置文件存放的目录
File photoesDir = new File(path);
if(!photoesDir.exists()){
photoesDir.mkdir();
}
t_name = fileItem.getName().substring(fileItem.getName().lastIndexOf("//") + 1);//截取文件名称
path = path + "//" +t_name;
System.out.println(path+"---------");
File file = new File(path);
// 上传操作,把用户在页面上传的文件保存在指定的路径
fileItem.write(file);
}catch(Exception e){
e.printStackTrace();
}
Product prd = new Product();
if(id!=""){
prd.setId(Integer.parseInt(id));
}
prd.setImages(t_name);
Category ca = (Category) dao.findByID(Integer.parseInt(map.get("product_type")));
//ca.setId(Integer.parseInt(category));
Provider provider = new Provider();
provider.setProvider_id(Integer.parseInt(map.get("provider_name")));
prd.setCategory(ca);
prd.setName(map.get("textfield"));
prd.setProvider_id(provider);
prd.setDescriptions(map.get("txt_article_class_description"));
prd.setProduct_addTime(map.get("textfield9"));
prd.setBasePrice(Double.parseDouble(map.get("textfield4")));
dao.addProduct(prd);
forward = mapping.findForward("add");
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("message", "当前系统不稳定请稍候再试");
forward = mapping.findForward("add");
}
return forward;
}
我的思路是:1、在页面的表单标签中加入一个enctype="multipart/form-data"属性,这个是用来规定文件上上传的格式
2、 使用这个组件你需要两个jar包,分别是:commons-io-1.4.jar和commons-fileupload-1.2.2.jar
3、通过request的到所有参数的集合,判断得到的参数是不是文本域,如果是就把参数的名字和值存放map集合中,如果不是文本域就把文件写入到指定的路径中