zoukankan      html  css  js  c++  java
  • Servlet 上传下载文件

    上传文件

    1)在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮

    2)表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data

    3)Commons-fileupload.jar性能优异,用来处理表单文件上传

    public class UploadServlet extends HttpServlet{
    	
    	 private static final long serialVersionUID = 1L;
         
    	    // 上传文件存储目录
    	    private static final String UPLOAD_DIRECTORY = "upload";
    	 
    	    // 上传配置
    	    private static final int MEMORY_THRESHOLD   = 1024 * 1024 * 3;  // 3MB
    	    private static final int MAX_FILE_SIZE      = 1024 * 1024 * 40; // 40MB
    	    private static final int MAX_REQUEST_SIZE   = 1024 * 1024 * 50; // 50MB
    	 
    	    /**
    	     * 上传数据及保存文件
    	     */
    	    protected void doPost(HttpServletRequest request,
    	        HttpServletResponse response) throws ServletException, IOException {
    	        // 检测是否为多媒体上传
    	        if (!ServletFileUpload.isMultipartContent(request)) {
    	            // 如果不是则停止
    	            PrintWriter writer = response.getWriter();
    	            writer.println("Error: 表单必须包含 enctype=multipart/form-data");
    	            writer.flush();
    	            return;
    	        }
    	 
    	        // 配置上传参数
    	        DiskFileItemFactory factory = new DiskFileItemFactory();
    	        // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
    	        factory.setSizeThreshold(MEMORY_THRESHOLD);
    	        // 设置临时存储目录
    	        factory.setRepository(new File("d:\tempDirectory"));
    	 
    	        ServletFileUpload upload = new ServletFileUpload(factory);
    	         
    	        // 设置最大文件上传值
    	        upload.setFileSizeMax(MAX_FILE_SIZE);
    	         
    	        // 设置最大请求值 (包含文件和表单数据)
    	        upload.setSizeMax(MAX_REQUEST_SIZE);
    
    	        // 中文处理
    	        upload.setHeaderEncoding("UTF-8"); 
    
    	        // 构造临时路径来存储上传的文件
    	        // 这个路径相对当前应用的目录
    	        String uploadPath = request.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY;
    	       
    	         
    	        // 如果目录不存在则创建
    	        File uploadDir = new File(uploadPath);
    	        if (!uploadDir.exists()) {
    	            uploadDir.mkdir();
    	        }
    	 
    	        try {
    	            // 解析请求的内容提取文件数据
    	            @SuppressWarnings("unchecked")
    	            List<FileItem> formItems = upload.parseRequest(request);
    	 
    	            if (formItems != null && formItems.size() > 0) {
    	                // 迭代表单数据
    	                for (FileItem item : formItems) {
    	                    // 处理不在表单中的字段
    	                    if (!item.isFormField()) {
    	                        String fileName = new File(item.getName()).getName();
    	                        String filePath = uploadPath + File.separator + fileName;
    	                        File storeFile = new File(filePath);
    	                        // 在控制台输出文件的上传路径
    	                        System.out.println(filePath);
    	                        // 保存文件到硬盘
    	                        item.write(storeFile);
    	                        request.setAttribute("message",
    	                            "文件上传成功!");
    	                    }
    	                }
    	            }
    	        } catch (Exception ex) {
    	            request.setAttribute("message",
    	                    "错误信息: " + ex.getMessage());
    	        }
    	        // 跳转到 message.jsp
    	        request.getServletContext().getRequestDispatcher("/message.jsp").forward(
    	                request, response);
    	    }
    
    }
    

    下载文件

    1)通知浏览器其所输出的内容的类型是文件,设置Content-Type 的值为:application/x-msdownload

    2)在 attachment 后面还可以指定 filename 参数,是服务器建议浏览器将实体内容保存到文件中的文件名称

    public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/x-msdownload"); String fileName = "oracle.docx"; response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); OutputStream out = response.getOutputStream(); String pptFileName = "D:\数据库实践.docx"; InputStream in = new FileInputStream(pptFileName); byte [] buffer = new byte[1024]; int len = 0; while((len = in.read(buffer)) != -1){ out.write(buffer, 0, len); } in.close(); } }

      

    参考文献: 菜鸟教程http://www.runoob.com/servlet/servlet-tutorial.html

  • 相关阅读:
    PowerDesigner生成SQL的冒号设置
    Linux/Windows 一键获取当前目录及子目录下所有文件名脚本
    Target runtime jdk1.8.0_181 is not defined
    windows——任务计划程序
    12篇文章回顾总结
    《逆商》2月12日
    《终身成长》2月11日
    《心流》 什么才是真正的幸福
    《心流》 什么才是真正的幸福 2月7日
    《高效能人士的7个习惯》 2月3日
  • 原文地址:https://www.cnblogs.com/walkwithmonth/p/10125879.html
Copyright © 2011-2022 走看看