Java web 中实现简单的文件上传与下载——学习笔记
来源:互联网 发布:外文电子图书数据库有 编辑:程序博客网 时间:2024/04/26 17:46
文件上传
主要步骤
1.首先在上传jsp页面表单头里写上enctype="multipart/form-data" 2.然后在处理的servlet里创建一个DiskFileItemFactory工厂 3.创建一个文件上传解析器 4.解析请求对象。parseRequest()方法,得到上传数据的集合 5.遍历集合,判断上传的是否是文件 6.上传文件的文件名处理 7.write()方法写入服务器目录
上传页面的jsp代码
<body> <form action="${pageContext.request.contextPath}/UploadServlet" enctype="multipart/form-data" method="post"> 上传用户:<input type="text" name="username"><br/> 上传文件1:<input type="file" name="file1"><br/> 上传文件2:<input type="file" name="file2"><br/> <input type="submit" value="提交"> </form> <a href="InitDownloadServlet">下载</a> </body>
处理上传的servlet代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全 String savePath = this.getServletContext() .getRealPath("WEB-INF/upload"); File file = new File(savePath); // 判断上传文件的保存目录是否存在 if (!file.exists()) { System.out.println(savePath + "目录不存在,需要创建"); file.mkdir(); } // 2、创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 1024 * 3000); // 设置仓库的大小 // 3、创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); // 这里是写了一个进程监控。 upload.setProgressListener(new ProgressListener() { @Override public void update(long arg0, long arg1, int arg2) { System.out.println("文件大小为:" + arg1 + ",当前已处理:" + arg0); } }); // 解决上传文件名的中文乱码 upload.setHeaderEncoding("utf-8"); // 判断提交上来的数据是否是上传表单的数据 if (!ServletFileUpload.isMultipartContent(request)) { // 按照传统方式获取数据 return; } // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合, // 每一个FileItem对应一个Form表单的输入项 List<FileItem> list = null; try { list = upload.parseRequest(request); } catch (FileUploadException e) { e.printStackTrace(); } if (list != null && list.size() > 0) { // 5.遍历上传所有的表单数据 for (FileItem item : list) { // 如果fileitem中封装的是普通输入项的数据 if (item.isFormField()) { String name = item.getFieldName(); System.out.println(name); } else { // 如果fileitem中封装的是上传文件 // 得到上传的文件名称 String filename = item.getName(); if (filename == null || "".equals(filename.trim())) { continue; } // 6.由于浏览器的不同,获取的文件名的前缀可能不一致,所以需要处理 filename = filename .substring(filename.lastIndexOf("\\") + 1); //获取文件名称不包含后缀 String name = filename.substring(0, filename.lastIndexOf(".")); // 截取文件扩展名 String extension = filename.substring(filename .lastIndexOf(".")); // 重新构建文件名称 每次上传会在名字后面加上时间,解决了重复上传覆盖。 filename = name + new Date().getTime() + extension; File savaFile = new File(file, filename); try { // 7.写入 item.write(savaFile); } catch (Exception e) { e.printStackTrace(); } item.delete(); System.out.println(filename + " 文件上传成功"); } } } }
文件的下载
文件下载比较简单,主要步骤如下:
1. 设置文件ContentType类型 2. 设置文件头 3. 得到要下载的文件,并放入输入流中 4. 通过响应对象获得输出流 5. 边读取边写入
初始化获得服务器端文件的servlet代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取服务器端下载的文件的路径 String savePath = this.getServletContext() .getRealPath("WEB-INF/upload"); // 通过服务器路径创建目录对象 File downloadDir = new File(savePath); // 获取目录下面所有文件 File[] files = downloadDir.listFiles(); // 把文件数组对象保存到request对象中 request.setAttribute("files", files); request.getRequestDispatcher("download.jsp").forward(request, response); }
处理下载的servlet代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String fileName = request.getParameter("fileName"); fileName = new String(fileName.getBytes("iso-8859-1"), "UTF-8"); String savePath = this.getServletContext().getRealPath( "/WEB-INF/upload"); // 1.设置文件ContentType类型,这样设置,会自动判断下载文件类型 response.setContentType("multipart/form-data"); // 2.设置文件头:最后一个参数是设置下载文件名 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); File saveFile = new File(savePath, "/" + fileName); InputStream in = new FileInputStream(saveFile); OutputStream out = response.getOutputStream(); byte[] bytes = new byte[512]; int len = 0; while ((len = in.read(bytes)) != -1) { out.write(bytes, 0, len); } in.close(); out.close(); }注:上面没有设置下载后文件的存放目录,默认的浏览器的下载目录,大部分浏览器都可以自行选择下载目录。当然自己也可以自己重写一个输出流,把文件写进去。 学习笔记,如有不足之处,还望指正。
0 0
- Java web 中实现简单的文件上传与下载——学习笔记
- java实现web端文件上传与下载
- Javaweb学习笔记10—文件上传与下载
- java Web实现文件上传、下载的解决方案
- struts实现简单的文件上传与下载
- java web 文件上传与下载
- Java Web 之文件上传与下载
- Java Web 之文件上传与下载
- Java Web 之文件上传与下载
- Java Web 之文件上传与下载
- Java Web 之文件上传与下载
- Struts2————学习笔记6 文件的上传与下载 以及AJAX
- Struts2学习笔记之文件的上传与下载
- Struts2学习笔记之文件的上传与下载
- php学习笔记(十)文件的上传与下载
- 文件上传与下载学习笔记(3)---面向对象方法实现文件上传
- java Web && 文件上传--简单实现
- .NET中实现文件的上传与下载
- 怎么样将android studio或者xamarin studio默认界面的标题栏去掉,便于html5打包apk,为了美观
- Android自定义View系列之动态变化的Button
- 开源项目DataBaseManager(二):“需求分析”
- 把session存到memecahe中
- mahout好文章
- Java web 中实现简单的文件上传与下载——学习笔记
- 9.3 保护视图级别的元素
- C语言实现链表之单向链表(二)结点内存申请及数据初始化
- C++类内存分布
- VHDL学习记录
- Linux内核原理-进程入门
- 孩子身高居然长这么快?
- HDU 1176 免费馅饼(DP)
- JavaScript命名空间