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

来源:互联网 发布:网络三巨头是什么意思 编辑:程序博客网 时间:2024/06/01 19:08

文件上传的要求:

  • 必须使用表单
  • 表单的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();//如果当前表单项的字段名为usernameif(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>

0 0
原创粉丝点击