004——使用servlet实现文件上传功能

文件上传的要求:

  • 必须使用表单
  • 表单的method是post
  • 表单的enctype必须是multipart/form-data

对servlet的要求:文件上传的表单数据都封装到request对象中

  • request.getParameter(String)方法只能获取字符内容,不是字节内容
  • 使用request的getInputStream()方法获取ServletInputStream对象(是InputStream的子类)
  • commons-fileupload是对ServletInputStream对象的解析
commons-fileupload:
  • 核心包:commons-fileupload.jar
  • 依赖包:commons-io.jar
fileupload的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem
  • 创建工厂类对象DiskFileItemFactory:DiskFileItemFactory dfif = new DiskFileItemFactory()
  • 使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(dfif)
  • 使用解析器解析request对象:List<FileItem> list = fileUpload.parseRequest(request)
FileItem:
一个FileItem对象对应一个表单项(表单字段)。一个表单中存在文件字段和普通字段,可以使用FileItem类的isFormField()方法来判断表单字段是否为普通字段,如果不是普通字段,那么就是文件字段了
  • l  String getName():获取文件字段的名称;

    l  String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;

    l  String getFieldName():获取字段名称,例如:<inputtype=”text” name=”username”/>,返回的是username;

    l  String getContentType():获取上传的文件的类型,例如:text/plain。

    l  int getSize():获取上传文件的大小;

    l  boolean isFormField():判断当前表单字段的文本类型:如果是普通文本字段返回true,否则是文件字段返回false;

    l  InputStream getInputStream():获取上传文件对应的输入流;

    l  void write(File):把上传的文件保存到指定文件中。

上传页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
  </head>
  
  <body>
	<div align="center">
		<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data">
			用户名:<input type="text" name="username"><br/>
			文件1:<input type="file" name="file1"><br/>
			<input type="submit" value="提交">
		</form>
	</div>
  </body>
</html>

文件解析代码
package com.java.fileUpload;

import java.io.File;
import java.io.IOException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		//创建工厂
		DiskFileItemFactory disk = new DiskFileItemFactory();
		//使用工厂创建解析器对象
		ServletFileUpload fileUpload = new ServletFileUpload(disk);
		try {
			//使用解析器对象解析request,得到FileItem列表
			List<FileItem> list = fileUpload.parseRequest(request);
			//遍历所有表单项
			for (FileItem fileItem : list) {
				//如果当前表单项为普通表单项
				if(fileItem.isFormField()) {
					//获取当前表单项的名称
					String fieldName = fileItem.getFieldName();
					//如果当前表单项的字段名为username
					if(fieldName.equals("username")) {
						//打印当前表单项的内容,即用户在username表单项输入的内容
						response.getWriter().print("用户名:" + fileItem.getString() + "<br/>");
					}
				} else { //表单项为文件字段
					//获取上传文件的名称
					String name = fileItem.getName();
					//如果上传文件的名称为空,说明没有指定上传文件
					if( name == null || name.isEmpty()) {
						continue;
					}
					//获取真实路径,对应${项目目录}/uploads,当然,这个目录必须存在
					String savePath = this.getServletContext().getRealPath("/uploads");
					//通过uploads目录和文件名称来创建file对象
					File file = new File(savePath, name);
					//把文件保存到指定位置
					fileItem.write(file);
					//打印上传文件的名称
					response.getWriter().print("上传文件名:" + name + "<br/>");
					//打印上传文件的大小
					response.getWriter().print("上传文件大小:" + fileItem.getSize() + "<br/>"); 
					//打印上传文件的类型
					response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "<br/>");
				}
			}
		} catch (Exception e) {
			throw new ServletException(e);
		}
	}

}
配置文件:
<?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">
  <display-name></display-name>
  <servlet>
    <servlet-name>FileUploadServlet</servlet-name>
    <servlet-class>com.java.fileUpload.FileUploadServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>FileUploadServlet</servlet-name>
    <url-pattern>/FileUploadServlet</url-pattern>
  </servlet-mapping>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值