基于servlet完成文件上传功能_方式一【原始手写流开发版】


本次文件依靠第三方组件(Apache)进行实现

commons-fileupload组件:

下载jar包:

commons-fileupload.jar

jar包下载地址:
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
操作指南:
http://commons.apache.org/proper/commons-fileupload/using.html

commons-io.jar

jar包下载地址:
http://commons.apache.org/proper/commons-io/download_io.cgi
操作指南:
http://commons.apache.org/proper/commons-io/description.html

文件上传的前提

1.form表单的method必须是post
2.form表单的组件得是file属性:比如:
3.form表单的enctype必须是multipart/form-data 以二进制字节流进行提交 传统接收参数的方式无效

代码演示

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


  
    MrYang Design File Upload
  
  
  
   	
名称

密码



  2.servlet中进行接受并且进行上传处理

package cn.javabs.web.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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 org.apache.commons.io.FilenameUtils;

public class UploadServlet extends HttpServlet {

	@SuppressWarnings("unchecked")
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		/**
		 * Set CharEncoding
		 */
		response.setContentType("text/html ;charset = utf-8 ");
		response.setCharacterEncoding("utf-8");
		request.setCharacterEncoding("utf-8");

		String name = request.getParameter("photoName");

		//  1. 用于判断jsp表单中的enctype 的属性值是不是multipart/form-data
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		// 如果不是multipart/form-data 则提醒
		if (!isMultipart) {
			response.getWriter().write("提交的不是multipart/form-data");
			return;
		}
		//实例化 磁盘文件项工厂对象  
		DiskFileItemFactory factory = new DiskFileItemFactory();

		//ServletFileUpload是用于解析request对象
		ServletFileUpload upload = new ServletFileUpload(factory);

		List items = null;

		try {
		//	通过ServletFileUpload得到所有上传项.每一个FileItem就相当于一个上传项
			items = upload.parseRequest(request);
		} catch (FileUploadException e) {
			throw new RuntimeException(e);
		}
		System.out.println("我们来一起看一下items是:" + items);
		// 循环取出所有的组件  其中组件包含有  普通组件 和  上传组件
		for (FileItem item : items) {
		//	通过判断确定 item中的普通组件   使用的判断方法是isFormField 
			// 是普通的表单字段
			if(item.isFormField()){
				System.out.println("这是普通的表单字段");
				// 获取表单中的属性  
				String fieldName = item.getFieldName();
				// 获取表单中的属性所对应的值  
				String fieldValue = item.getString();
				
				System.out.println(fieldName +":" + fieldValue);
			}	
			// 是上传的表单字段
			else{
				System.out.println("这是上传的表单字段");
				// 获取字节输入流
				InputStream in = item.getInputStream();
				
				// 获取上传文件的名称
				String uploadName = item.getName();
				
				// 判断上传文件的名称是否为null,如果不为空
				if(uploadName != null){
					// 文件名称     =		 获取文件名称,并且包含后缀
					uploadName = FilenameUtils.getName(uploadName);
				}
				
				// 文件存放的真实路径	 其实files文件夹 存放在Tomcat服务器的项目里面
				String filePath = getServletContext().getRealPath("/files");
				
				// 根据真实的路径 进行实例化创建目录
				File file = new File(filePath);
				
				// 如果目录不存在
				if(!file.exists()){
					//创建多级目录
					file.mkdirs();
				}
				// 根据  真实目录  + "\" + 文件名称  [file.separator 的结果是 "\"]
				OutputStream out = new FileOutputStream(filePath +  file.separator + uploadName );
				
				// 定义长度  初始化值为0
				int len = 0;
				
				//定义字节缓冲区数组
				byte [] b = new byte[1024];
				
				// 循环
				while ((len = in.read(b))!=-1) {
					out.write(b, 0, len);
				}
				// 关闭输出流
				out.close();
				// 关闭输入流
				in.close();
				// 删除临时文件
				item.delete();
			}
		}

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doGet(request, response);

	}

}

  别忘了还有web.xml

<?xml version="1.0" encoding="UTF-8"?>

  
  
    UploadServlet
    cn.javabs.web.controller.UploadServlet
  

  
    UploadServlet
    /servlet/UploadServlet
  	
  
    index.jsp