上传----------------------------------------服务器处理浏览器上传并保持的功能

提交上传文件时, 要利用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("上传成功");

posted on 2017-09-10 21:52  小丰残月  阅读(89)  评论(0编辑  收藏  举报

导航