Struts2.0文件上传原理

Struts2文件上传默认采用apache的文件上传的包,新建处理上传的Servlet 如下:

 

 

在WebRoot下面新建文件夹:upload,项目发布到服务器中去时服务器中就一个upload的文件夹

web.xml中Servlet配置如下:

 

<servlet>
  <servlet-name>UploadServlet</servlet-name>
  <servlet-class>com.mengya.servlet.UploadServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>UploadServlet</servlet-name>
  <url-pattern>/UploadServlet</url-pattern>
 </servlet-mapping> 

 

    新建JSP如下:

 

<form action="UploadServlet" method="post" enctype="multipart/form-data">
     username:<input type="text" name="username"><br>
     password:<input type="password" name="password"><br>
     file1:<input type="file" name="file1"><br>
     file2:<input type="file" name="file2"><br>
     <input type="submit" value="上传">
    </form>

  

/**
 * 
 * @author 张明学
 *	
 *	使用apache的commons-io-1.3.2.jar,commons-fileupload-1.2.1.jar完成处理文件上传的Servlet
 */
public class UploadServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/**
		 * request.getRealPath("/")返回的是当前项目所在硬盘的路径 如:C:\Program Files\Apache
		 * Software Foundation\Tomcat 6.0\webapps\Struts2_9\
		 * request.getRealPath("/upload")返回的是当前项目所在硬盘的路径+根目录下面的upload的路径
		 * 如:C:\Program Files\Apache Software Foundation\Tomcat
		 * 6.0\webapps\Struts2_9\Upload
		 */
		String path = request.getRealPath("/upload");
		DiskFileItemFactory factory = new DiskFileItemFactory();
		/**
		 * Apache上传组件上传的文件若小于某一值时就将要上面的文件放在内存中,否则就放到一个临时的目录中去。
		 */
		/**
		 * 设置文件小于多少时放到内存当中去。1024*1024为1M的大小
		 */
		factory.setSizeThreshold(1024 * 1024);
		/**
		 * 设置大于上面设置的大小的文件上传时所放的临时目录,上传完成后临时目录所存放的垃圾文件不自动删除。
		 */
		factory.setRepository(new File(path));
		/**
		 * ServletFileUpload完成上传的核内类
		 */
		ServletFileUpload servletUpload = new ServletFileUpload(factory);
		try {
			List<FileItem> list = servletUpload.parseRequest(request);
			for (FileItem item : list) {
				/**
				 * 非file字段,即普通的字段
				 */
				if (item.isFormField()) {
					/**
					 * 获得字段的名称,即对应页面文本框等的名称
					 */
					String name = item.getFieldName();
					/**
					 * 以gbk方式获得该字段的value值,即对应页面文本框等所输入的值
					 */
					String value = item.getString("gbk");

					request.setAttribute(name, value);
				} else {
					/**
					 * file型字段
					 */
					/**
					 * 获得页面file的名称
					 */
					String name = item.getFieldName();
					/**
					 * 获得页面file中用户选择的文件的路径(与普通的字段不同)
					 * 由于不同的浏览器所取得值不同,有的得到是所选择文件的路径,有的得到的就是所选择的文件的名称。
					 * 如:有的浏览器所取得的是:C:\Documents and
					 * Settings\Administrator\桌面\电话本.txt 有的浏览器所取得的是:电话本.txt
					 */
					String value = item.getName();
					/**
					 * 下面做一个统一的处理 若为文件名则下面没有”\“则start为-1
					 */
					int start = value.lastIndexOf("\\");
					String fileName = value.substring(start + 1);
					request.setAttribute(name, fileName);
					/**
					 * 下面做上传的处理
					 */
					InputStream is = item.getInputStream();
					/**
					 * 上传的路径依然选择path
					 */
					File UploadFile = new File(path, fileName);
					OutputStream os = new FileOutputStream(UploadFile);

					byte[] buffer = new byte[400];
					int length = 0;
					while ((length = is.read(buffer)) > 0) {
						os.write(buffer, 0, buffer.length);
					}
					os.close();
					is.close();
					
					/**
					 * 更简单的上传方式
					 * 无需使用InputStream和OutputStream对象item.write(File)即可
					 * item.write(UploadFile);
					 */
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}

	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}
}

 

你可能感兴趣的:(apache,tomcat,浏览器,servlet,OS)