1、目标
使用servlet的方式实现文件上传;
2、使用的技术
使用的apache公司的fileUpload的jar包
配合装饰模式完成mutipart/form-data方式的接收参数问题;
3、核心代码
a、对httpServletRequestWapper的装饰类;
- package com.wen.decorator;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletRequestWrapper;
- import org.apache.commons.fileupload.FileItemIterator;
- import org.apache.commons.fileupload.FileItemStream;
- import org.apache.commons.fileupload.FileUploadException;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- import org.apache.commons.fileupload.util.Streams;
- public class MultipartWrapper extends HttpServletRequestWrapper {
- private Map<String, String[]> params = new HashMap<String, String[]>();
- // private final static String PATH =
- // "C:\\Users\\John_wen\\Workspaces\\MyEclipse 10\\FileUpload\\WebRoot\\upload\\";
- public MultipartWrapper(HttpServletRequest request) throws FileUploadException, IOException {
- super(request);
- setParams(request);
- }
- private void setParams(HttpServletRequest request) throws FileUploadException, IOException {
- boolean isMul = ServletFileUpload.isMultipartContent(request);
- if (isMul) {// 如果为true表示是文件上传
- ServletFileUpload upload = new ServletFileUpload();
- FileItemIterator fileItemIterator = upload.getItemIterator(request);
- InputStream is = null;
- while (fileItemIterator.hasNext()) {
- FileItemStream fis = fileItemIterator.next();
- is = fis.openStream();
- if (fis.isFormField()) {
- setFormField(fis.getFieldName(), is);
- } else {
- if (fis.getName() != null && !"".equals(fis.getName())) {
- String path = request.getSession().getServletContext().getRealPath("/upload");
- // 表示文件,上传操作
- Streams.copy(is, new FileOutputStream(path + "\\" + fis.getName()), true);
- }
- params.put(fis.getFieldName(), new String[] { fis.getName() });
- }
- }
- } else {// 正常流程
- params = request.getParameterMap();
- }
- }
- private void setFormField(String fieldName, InputStream is) throws IOException {
- // 先取出params中对应的fieldName的值;
- String[] values = params.get(fieldName);
- if (params.containsKey(fieldName)) {
- // 如果包含有key
- values = Arrays.copyOf(values, values.length + 1);
- values[values.length - 1] = Streams.asString(is);
- params.put(fieldName, values);
- } else {
- params.put(fieldName, new String[] { Streams.asString(is) });
- }
- }
- @Override
- public String getParameter(String name) {
- String[] values = params.get(name);
- if (values != null) {
- return values[0];
- } else {
- return null;
- }
- }
- @Override
- public Map<String, String[]> getParameterMap() {
- return params;
- }
- @Override
- public String[] getParameterValues(String name) {
- String[] values = params.get(name);
- if (values != null) {
- return values;
- } else {
- return null;
- }
- }
- }
- package com.wen.action;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.fileupload.FileUploadException;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- import com.wen.decorator.MultipartWrapper;
- public class UploadServlet extends HttpServlet {
- /**
- * The doGet method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request
- * the request send by the client to the server
- * @param response
- * the response send by the server to the client
- * @throws ServletException
- * if an error occurred
- * @throws IOException
- * if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
- out.println("<HTML>");
- out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
- out.println(" <BODY>");
- out.print(" This is ");
- out.print(this.getClass());
- out.println(", using the GET method");
- out.println(" </BODY>");
- out.println("</HTML>");
- out.flush();
- out.close();
- }
- /**
- * The doPost method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to
- * post.
- *
- * @param request
- * the request send by the client to the server
- * @param response
- * the response send by the server to the client
- * @throws ServletException
- * if an error occurred
- * @throws IOException
- * if an error occurred
- */
- public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- request.setCharacterEncoding("utf-8");
- try {
- fileUpload(request, response);
- } catch (FileUploadException e) {
- e.printStackTrace();
- }
- }
- public void fileUpload(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException, FileUploadException {
- if (ServletFileUpload.isMultipartContent(request)) {
- request = new MultipartWrapper(request);
- }
- System.out.println("用户名" + request.getParameter("userName"));
- System.out.println("文件名" + request.getParameter("fileName"));
- // System.out.println("兴趣:"+request.getParameterValues("intrest").toString());
- String[] intrest = request.getParameterValues("intrest");
- System.out.println("-------------兴趣-----------");
- for (String str : intrest) {
- System.out.println(str);
- }
- }
- }
4、源码下载