一、前言

在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为commons-fileupload依赖于commons-io这个包,所以需要下载这两个包commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar,笔者已经打包好(点击下载)

1、搭建环境

创建Web项目,将包导入到项目lib下

Javaweb学习笔记——上传下载文件

2、实现文件上传

(第一种上传的方法)

新建upload.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>upload file</title>
</head>
<body>
    <!--这里的<%=request.getContextPath()%>是表示项目的绝对路径,也就是说不管你以后将项目拷贝到哪个位置,它都会找到准确的路径  -->
    <form action="<%=request.getContextPath()%>/uploadServlet" enctype="multipart/form-data" method="post">
        <span>选择文件:</span><input type="file" name="file1">
        <input type="submit" value="上传">
    </form>
</body>
</html>

新建处理文件上传的Servlet

package com.load;

import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;
@WebServlet("/uploadServlet")
public class uploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public uploadServlet() {
        super();
    }
    /* fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象;
     * FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求
     * (即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件
     * */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过isMultipartContent()方法:分析请求里面是不是有文件上的请求,
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if(isMultipart){
            //创建可设置的磁盘节点工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //获取请求的上下文信息
            ServletContext servletContext = request.getServletContext();
            //缓存目录,每个服务器特定的目录
            File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
            //设置服务器的缓存目录
            factory.setRepository(repository);
            //ServletFileUpload 对象的创建需要依赖于 FileItemFactory 
            //工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。
            ServletFileUpload upload = new ServletFileUpload(factory);
            try {
                //解析即被包装之后的 HttpServletRequest对象,既是分离文本表单和上传文件(http请求会被包装为HttpServletRequest)
                List<FileItem> items = upload.parseRequest(request);
                for(FileItem item:items){
                    String fieldName = item.getFieldName();    
                    String fileName = item.getName();
                    String contentType = item.getContentType();
                    boolean isInMemory = item.isInMemory();
                    long sizeInBytes = item.getSize();
                    //实例化一个文件
                    //request.getRealPath(获取真实路径)
                    File file = new File(request.getRealPath("/")+"/loads"+fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length()));
                    item.write(file);
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                
                e.printStackTrace();
            }
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

 

(第二种上传的方法)

新建Jsp页面(同上,只是路径改变下)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>upload file</title>
</head>
<body>
    <!--这里的<%=request.getContextPath()%>是表示项目的绝对路径,也就是说不管你以后将项目拷贝到哪个位置,它都会找到准确的路径  -->
    <form action="<%=request.getContextPath()%>/uploadservlet1" enctype="multipart/form-data" method="post">
        <span>选择文件:</span><input type="file" name="file1">
        <input type="submit" value="上传">
    </form>
</body>
</html>
JSP页面

相关文章: