提交上传文件时, 要利用form表单,而且method="post"
文件一般字节比较多,get的长度无法满足其要求. 对于enctype="multipart/form-data" 的表单 不能使用req.getParameter来获取action的值.对于input /select/textarea 等表单域,每个表单标签 (有name属性的)都会生成一个DiskFileItem 然后通过file.getFieldName()可以获取这个表单的名字,getString()获得这个表单对应的值 对于type="file" 额外的 getName()可以获得用户选择的文件的名字.if(req.getContentType().startsWith(multipart/form-data))FileUpload提供了一个方法 跟这个原理是一样的if(ServletFileUpload.isMultipartContent(req))//判断这个报文的content-Type是否以multipart/form-data开头{ String temp=req.getSession().getServletContext().getRealPath("/WEB-INF/temp")//建立一个临时文件夹File fileTemp=new File(temp);//上传文件的字节限制,两个参数 一个是字节限制,一个是临时文件夹DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory(4*1024*1024,fileTemp );ServletFileUpload upload=new ServletFileUpload(diskFileItemFactory);//upload从请求中解析出上传的内容.包括表单属性值,文件名,文件内容.List<FileItem> files=upload.parseRequest(req);//因为一个表单标签对应一个FileItem对象.//这个是自己封装的一个通过String fileName来从list中拿到对应的FileItem对象的方法.FileItem actionDiskItem=RupengUtils.findDiskFileItem(files, "action");//提交文件的表单标签name="f1" 可以通过RupengUtils.findDiskFileItem(files, "f1");//拿到这个f1对应的FileItem 对象;通过getString()来拿到文件的流;FileOutputStream fos=new FileOutputStream(req.getSession().getServletContext().getRealPath("/upload/"+f1.getName()))//写到磁盘相对于根目录"/"的路径为upload的文件夹里以f1.getName()的名字写入.IOUtils.copy(f1.getInputStream(),fos); //commons-io 提供的拷贝的方法完成拷贝.后面再关闭流以及。resp.getWriter().print("上传成功");