java文件上传

99 阅读2分钟

java代码 servlet包

package servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import util.FileUtil;

public class RegistServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("registServlet");
		InputStream is = null;
		FileOutputStream fos = null;
		//1.判断是否为multipart类型的请求
		if(!ServletFileUpload.isMultipartContent(req)) {
			throw new RuntimeException("不是Multipart请求");
		}else {
			//2.获取工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			//3.通过工厂创建核心组件
			ServletFileUpload sfu = new ServletFileUpload(factory);
			try {
				//4.通过核心组件解析请求,获取List<item>
				List<FileItem> items = sfu.parseRequest(req);
				//5.遍历items
				for(FileItem item : items) {
					//6.判断是否为普通参数
					if(item.isFormField()) {
						//7.获取普通参数的key和value
						String key = item.getFieldName();
						String value = item.getString();
						System.out.println("key:"+key+",value:"+value);
					}else {
						//8.获取文件信息
						String fileName = item.getName();		//获取文件名
						System.out.println("fileName:"+fileName);
						//9.获取输入流(文件在这个流里面)
						is = item.getInputStream();
						//10.创建一个输出流
						String url = req.getServletContext().getRealPath("/file/a/b/c");		//获取真实路径
						System.out.println("url:"+url);
						//D:\apache-tomcat-9.0.24\webapps\javaweb11\file
						//保证这个路径已经创建
						fos = new FileOutputStream(FileUtil.createFile(url, fileName));
						byte[] bytes = new byte[1024];
						int len = 0;
						while((len=is.read(bytes)) != -1) {
							fos.write(bytes, 0, len);
						}
					}
				}
			} catch (FileUploadException e) {
				e.printStackTrace();
			} finally {
				if(is != null) {
					is.close();
				}
				if(fos != null) {
					fos.close();
				}
			}
		}
	}
}


package servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ToRegistServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getRequestDispatcher("WEB-INF/jsp/regist.jsp").forward(req, resp);
	}
}

filter包

package filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyFilter extends HttpFilter{
	@Override
	protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();  
		request.getServletContext().setAttribute("basePath", basePath);
		super.doFilter(request, response, chain);
	}
}

util包

package util;

import java.io.File;

public class FileUtil {
	/**
	 * 判断这个路径是否存在,如果不存在则创建
	 */
	//parentUrl:D://卓讯/课件		childUrl:文件上传.pdf
		public static File createFile(String parentUrl, String childUrl) {
			File file = new File(parentUrl);
			if (!file.exists()) {
				file.mkdirs();
			}
			File result = new File(parentUrl, childUrl);
			return result;
		}
}

html代码

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户注册</title>
</head>
<body>
	<form action="<%=application.getAttribute("basePath") %>/regist.do" method="post" enctype="multipart/form-data">
		用户名:<input type="text" name="username"><br>
		密码:<input type="password" name="password"><br>
		上传文件:<input type="file" name="registfile"><br>
		<input type="submit" value="提交">
	</form>
</body>
</html>

web.xml代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>fileloade</display-name>
  <servlet>
  		<servlet-name>registServlet</servlet-name>
  		<servlet-class>servlet.RegistServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  		<servlet-name>registServlet</servlet-name>
  		<url-pattern>/regist.do</url-pattern>
  </servlet-mapping>
  <servlet>
  		<servlet-name>toRegisterServlet</servlet-name>
  		<servlet-class>servlet.ToRegistServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  		<servlet-name>toRegisterServlet</servlet-name>
  		<url-pattern>/toregist.do</url-pattern>
  </servlet-mapping>
  <filter>
  		<filter-name>myFilter</filter-name>
  		<filter-class>filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
  		<filter-name>myFilter</filter-name>
  		<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

访问路径: http://localhost:8080/fileloade/toregist.do

bug:当启动tomcat是上传的内容被清空。

需要jar包: /fileloade/WebContent/WEB-INF/lib/commons-fileupload-1.3.1.jar /fileloade/WebContent/WEB-INF/lib/commons-io-2.2.jar /fileloade/WebContent/WEB-INF/lib/jstl-1.2.jar /fileloade/WebContent/WEB-INF/lib/servlet-api.jar /fileloade/WebContent/WEB-INF/lib/standard-1.1.2.jar