apache上传下载

来源:互联网 发布:菜单设计制作软件 编辑:程序博客网 时间:2024/06/07 04:50

使用apache-fileupload处理文件上传

框架:是指将用户经常处理的业务进行一个代码封装。让用户可以方便的调用。
目前文件上传的(框架)组件:
Apache----fileupload -
Orialiy – COS – 2008() -
Jsp-smart-upload – 200M。

用fileupload上传文件:

需要导入第三方包:
Apache-fileupload.jar – 文件上传核心包。
Apache-commons-io.jar – 这个包是fileupload的依赖包。同时又是一个工具包。
核心类:
DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个具类。
ServletFileUpload - 文件上传的核心类,此类接收request,并解析reqeust。

servletfileUpload.parseRequest(requdest) - List<FileItem>
 
一个FileItem就是一个标识的开始:---------243243242342 到 ------------------245243523452—就是一个FileItem

第一步:导入包


第二步:书写一个servlet完成doPost方法

特别注意 form一定要写规范 否则 会报错  input一定要给名字 就算没用
<form action="<c:url value='/UpServlet'/>" method="post" enctype="multipart/form-data">    File1:<input type="file" name="txt"><br/>    <input type="submit"/>    </form>


如果你没有为DiskFileItemFactory 指定临时目录 就用系统的目录
@Testpublic void test(){String path =System.getProperty("java.io.tmpdir");System.err.println(path);}

输出结果C:\Users\ADMINI~1\AppData\Local\Temp\
获取系统所有的属性
@Testpublic void temp(){Properties prop =System.getProperties();Enumeration<Object>  en = prop.keys();while(en.hasMoreElements()){String key = (String) en.nextElement();System.err.println(key+"====="+prop.getProperty(key));}}

/** * DiskFileItemFactory构造的两个参数 * 第一个参数:sizeThreadHold - 设置缓存(内存)保存多少字节数据,默认为10K *    如果一个文件没有大于10K,则直接使用内存直接保存成文件就可以了。 *  如果一个文件大于10K,就需要将文件先保存到临时目录中去。 * 第二个参数 File 是指临时目录位置 * */public class Up2Servlet extends HttpServlet {public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("UTf-8");//获取项目的路径String path = getServletContext().getRealPath("/up");//第一步声明diskfileitemfactory工厂类,用于在指的磁盘上设置一个临时目录DiskFileItemFactory disk = new DiskFileItemFactory(1024*10,new File("d:/a"));//第二步:声明ServletFileUpoload,接收上面的临时目录ServletFileUpload up = new ServletFileUpload(disk);//第三步:解析requesttry {List<FileItem> list =  up.parseRequest(req);//如果就一个文件FileItem file = list.get(0);//获取文件名,带路径String fileName = file.getName();fileName = fileName.substring(fileName.lastIndexOf("\\")+1);//获取文件的类型String fileType = file.getContentType();//获取文件的字节码InputStream in = file.getInputStream();//声明输出字节流OutputStream out = new FileOutputStream(path+"/"+fileName);//文件copybyte[] b = new byte[1024];int len = 0;while((len=in.read(b))!=-1){out.write(b,0,len);}out.close();long size = file.getInputStream().available();//删除上传的临时文件file.delete();//显示数据resp.setContentType("text/html;charset=UTf-8");PrintWriter op = resp.getWriter();op.print("文件上传成功<br/>文件名:"+fileName);op.print("<br/>文件类型:"+fileType);op.print("<br/>文件大小(bytes)"+size);} catch (Exception e) {e.printStackTrace();}}}

上传多个文件

第一步:修改页面的表单为多个input type=”file”

<form action="<c:url value='/Up3Servlet'/>" method="post" enctype="multipart/form-data">    File1:<input type="file" name="txt"><br/>    File2:<input type="file" name="txt"><br/>    <input type="submit"/>    </form>
public class Up2Servlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String path = getServletContext().getRealPath("/up");// 声明diskDiskFileItemFactory disk = new DiskFileItemFactory();disk.setSizeThreshold(1024 * 1024);disk.setRepository(new File("f:/a"));// 声明解析requst的servletServletFileUpload up = new ServletFileUpload(disk);try {// 解析requstList<FileItem> list = up.parseRequest(request);// 声明一个list<map>封装上传的文件的数据List<Map<String, String>> ups = new ArrayList<Map<String, String>>();for (FileItem file : list) {Map<String, String> mm = new HashMap<String, String>();// 获取文件名String fileName = file.getName();fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);String fileType = file.getContentType();InputStream in = file.getInputStream();int size = in.available();// 使用工具类FileUtils.copyInputStreamToFile(in, new File(path + "/"+ fileName));mm.put("fileName", fileName);mm.put("fileType", fileType);mm.put("size", "" + size);ups.add(mm);file.delete();}request.setAttribute("ups", ups);// 转发request.getRequestDispatcher("/jsps/show.jsp").forward(request,response);} catch (Exception e) {e.printStackTrace();}}}

动态上传多个文件

       核心问题:

     在页面上应该可以控制<input type=”file”/>多少。

   

第一步:用table的格式化

  <form name="xx" action="<c:url value='/Up3Servlet'/>" method="post" enctype="multipart/form-data">    <table id="tb" border="1">    <tr>    <td>    File:    </td>    <td>    <input type="file" name="file">    <button onclick="_del(this);">删除</button>    </td>    </tr>    </table>    <br/><input type="button" onclick="_submit();" value="上传"><input onclick="_add();" type="button" value="增加"></form>  </body>  <script type="text/javascript">  function _add(){  var tb = document.getElementById("tb");  //写入一行  var tr = tb.insertRow();  //写入列  var td = tr.insertCell();  //写入数据  td.innerHTML="File:";  //再声明一个新的td  var td2 = tr.insertCell();  //写入一个input  td2.innerHTML='<input type="file" name="file"/><button onclick="_del(this);">删除</button>';  }  function _del(btn){  var tr = btn.parentNode.parentNode;  //alert(tr.tagName);  //获取tr在table中的下标  var index = tr.rowIndex;  //删除  var tb = document.getElementById("tb");  tb.deleteRow(index);  }  function _submit(){  //遍历所的有文件  var files = document.getElementsByName("file");  if(files.length==0){  alert("没有可以上传的文件");  return false;  }  for(var i=0;i<files.length;i++){  if(files[i].value==""){  alert("第"+(i+1)+"个文件不能为空");  return false;  }  }document.forms['xx'].submit();  }  </script></html>

解决文件的重名的问题

public class UpImgServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String path = getServletContext().getRealPath("/up");DiskFileItemFactory disk = new DiskFileItemFactory(1024*10,new File("d:/a"));ServletFileUpload up = new ServletFileUpload(disk);try{List<FileItem> list = up.parseRequest(request);//只接收图片*.jpg-iamge/jpege.,bmp/imge/bmp,png,List<String> imgs = new ArrayList<String>();for(FileItem file :list){if(file.getContentType().contains("image/")){String fileName = file.getName();fileName = fileName.substring(fileName.lastIndexOf("\\")+1);//获取扩展String extName = fileName.substring(fileName.lastIndexOf("."));//.jpg//UUIDString uuid = UUID.randomUUID().toString().replace("-", "");//新名称String newName = uuid+extName;FileUtils.copyInputStreamToFile(file.getInputStream(),new File(path+"/"+newName));//放到listimgs.add(newName);}file.delete();}request.setAttribute("imgs",imgs);request.getRequestDispatcher("/jsps/imgs.jsp").forward(request, response);}catch(Exception e){e.printStackTrace();}}}


0 0
原创粉丝点击