zoukankan      html  css  js  c++  java
  • 【Servlet3.0新特性】第03节_文件上传

    这是一个Web Project


    首先是web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    	<!-- Servlet3.0需要Tomcat7和JavaEE6,配置方法详见 -->
    	<!-- http://blog.csdn.net/jadyer/article/details/9164655 -->
    	<!-- http://blog.csdn.net/jadyer/article/details/9164737 -->
    	<welcome-file-list>
    		<welcome-file>index.jsp</welcome-file>
    	</welcome-file-list>
    </web-app>

    下面是表单输入页index.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>
    <form action="<%=request.getContextPath()%>/upload" method="POST" enctype="multipart/form-data">
    	<input name="uploadFile" type="file"><br/>
    	<input type="submit">
    <form>


    最后是用于处理文件上传的HelloServlet.java

    package com.jadyer.servlet;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;
    
    /**
     * Servlet3.0新特性之便利的文件上传
     * @see ------------------------------------------------------------------------------------------------------------------
     * @see 注意要使用@MultipartConfig注解标明此Servlet支持文件上传
     * @see 否则获取到的javax.servlet.http.Part就是空的,Part.getXxx()就会报告NullPointerException
     * @see ------------------------------------------------------------------------------------------------------------------
     * @see 关于@MultipartConfig的几个属性
     * @see location--->指定存储所上传文件的目录....分以下两种情况
     * @see             1)若part.write(fileName)传的参数只有上传的文件名,那么最后文件就会被上传到location目录中
     * @see               若此时location所指定的目录不存在,则会报告下面的异常(Tomcat7.x启动时不会报)
     * @see               java.io.IOException: The temporary upload location [D:\upload22] is not valid
     * @see             2)若part.write(savePath+"/"+fileName),则无论location是否指定目录,最后文件都会被上传到savePath
     * @see               但是,如果此时location所指定的目录不存在,那么也会报告第一种情况中的异常,并导致上传文件失败
     * @see             总结:API说location是储存文件的目录,但根据上面两种情况,我感觉location指的是临时文件目录,故不推荐使用
     * @see             总结:随后我又查看了Oracle官方文档,发现该属性指的就是临时文件目录
     * @see             总结:其官方文档的地址为http://docs.oracle.com/javaee/6/tutorial/doc/gmhal.html
     * @see fileSizeThreshold-->设置阈值,达到阈值后会将所上传的文件从临时目录中写到磁盘..单位为byte,默认值是0
     * @see maxFileSize-------->允许上传的单个文件最大值,即不限制文件总数及总大小,只限制单个文件..单位为byte,默认值是-1,即无限制
     * @see maxRequestSize----->允许上传的文件的最大值,这里指的是一次性上传的所有文件的合计大小..单位也是byte,默认值是-1,即无限制
     * @see ------------------------------------------------------------------------------------------------------------------
     * @create Jun 24, 2013 3:19:12 PM
     * @author 玄玉<http://blog.csdn.net/jadyer>
     */
    @WebServlet(urlPatterns="/upload")
    @MultipartConfig(fileSizeThreshold=1024*1024*2, maxFileSize=1024*1024*20, maxRequestSize=1024*1024*200)
    public class HelloServlet extends HttpServlet {
    	private static final long serialVersionUID = -1812698941752545746L;
    
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		//解决上传文件的中文乱码问题
    		req.setCharacterEncoding("UTF-8");
    		//解决应答给浏览器的中文乱码问题
    		resp.setCharacterEncoding("UTF-8");
    		
    		//回显上传结果给浏览器
    		String uploadResult = null;
    		PrintWriter out = resp.getWriter();
    		resp.setContentType("text/html; charset=UTF-8");
    		try{
    			//获取上传的文件的Part,下面的操作都是以这个Part为中心的
    			Part part = req.getPart("uploadFile");
    			
    			//本例中它的值是form-data; name="uploadFile"; filename="玄玉.png"
    			String _str = part.getHeader("content-disposition");
    			//获取上传的文件真实名字(含后缀)
    			String fileName = _str.substring(_str.lastIndexOf("=")+2, _str.lastIndexOf("""));
    			
    			//指定上传的文件的存储目录并确保其存在
    			String savePath = "D:/upload/";
    			File savePathFolder = new File(savePath);
    			if(!savePathFolder.exists()){
    				savePathFolder.mkdirs();
    			}
    			//上传文件(写入磁盘)
    			part.write(savePath + "/" + fileName);
    			uploadResult = "上传完毕<br/>上传的文件Part=" + part.getName() + "<br/>上传的文件名称=" + fileName
    						 + "<br/>上传的文件大小=" + part.getSize() + "<br/>上传的文件类型=" + part.getContentType();
    		}catch(IllegalStateException ise){
    			uploadResult = "上传失败,失败原因如下<br/>" + ise.getMessage();
    		}
    		out.print(uploadResult);
    		out.flush();
    		out.close();
    	}
    }
  • 相关阅读:
    Linux 用户 quote 配置 说明
    Linux 用户和用户组 配置说明
    ORA-00600: [kck_rls_check must use (11,0,0,0,0) or lower] 故障解决
    Oracle Data Guard PING[ARC2]: Heartbeat failed to connect to standby ''. Error is 12514 故障分析
    Oracle 11g RAC OCR 与 db_unique_name 配置关系 说明
    Data Guard 奇葩的 ORA-16191: Primary log shipping client not logged on standby 问题
    Oracle 11gR2 RMAN Duplicate 触发PLS-00201: identifier 'DBMS_RCVCAT.GETDBID' must be declared 错误
    RMAN RAC 到 单实例 duplicate 自动分配通道 触发 ORA-19505 错误
    Secure CRT 自动记录日志 配置 小记
    VBox fdisk 不显示 添加的硬盘 解决方法
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3155559.html
Copyright © 2011-2022 走看看