欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java upload文件上传

程序员文章站 2022-06-13 16:03:40
...

Java upload文件上传

文件的上传和下载的实质就是文件拷贝。

文件上传:从本地拷贝到服务器磁盘上。  客户端需要编写文件上传表单---->服务器需要编写代码接受上传的文件。

文件下载:从服务器拷贝到本地磁盘。  需要编写服务端代码,客户端下载的工作由浏览器内核解决。

文件上传

    1.文件上传步骤

    (1)编写一个文件上传的表单

    (2)编写服务端代码用于接收文件上传


    2.JSP页面编码

     文件上传时的表单设计要符合文件提交的方式:

    (1)提交方式:post

    (2)表单中有文件上传的表单项:<input type="file"/>

    (3)指定表单类型:文件上传类型: enctype="multipart/form-data"
<%@ 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>文件上传</title>
</head>
<body>


    <form action="${pageContext.request.contextPath }/FileUploadServlet"
        method="post" enctype="multipart/form-data">

        <input type="text" name="username">
        <input type="file" name="filename">
        <input type="submit" value="上传">

        </form>

</body>
</html>
3.Servlet编码

    FileUpload组件,也叫文件上传组件,是Apache提供的开源项目
组件使用方法:

(1)下载,引入jar文件。

   引入commons-fileupload-1.2.1.jar
   引入依赖包commons-io-1.4.jar
package com.hao.servlet;

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.IOUtils;

public class FileUploadServlet extends HttpServlet {

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

        try {
            // 创建磁盘文件项工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // 设置临时文件的大小
            factory.setSizeThreshold(1024 * 1024);
            // 设置临时文件存储的位置
            String path_temp = this.getServletContext().getRealPath("temp");
            factory.setRepository(new File(path_temp));

            // 创建文件上传的核心类
            ServletFileUpload upload = new ServletFileUpload(factory);
            // 设置上传文件的名称的编码
            upload.setHeaderEncoding("UTF-8");
            // 解析request获得文件项集合
            List<FileItem> parseRequest = upload.parseRequest(request);

            if (parseRequest != null) {
                // 判断表单是否是文件上传的表单
                boolean multipartContent = upload.isMultipartContent(request);
                if (multipartContent) {
                    // 是文件上传表单
                    for (FileItem item : parseRequest) {
                        // 判断是不是一个普通表单项
                        if (item.isFormField()) {
                            // 普通表单项
                            String fieldName = item.getFieldName();
                            // 对普通表单的项的内容进行编码
                            String fieldValue = item.getString("utf-8");
                            System.out
                                    .println(fieldName + "-----" + fieldValue);
                            // 当表单是enctype="multipart/form-data"时
                            // request.getParameter相关的方法全部失效
                        } else {
                            // 文件上传项
                            // 文件的名称
                            String fileName = item.getName();
                            // 获得上传文件的内容
                            InputStream in = item.getInputStream();
                            // 文件上传到什么位置
                            String path_store = this.getServletContext()
                                    .getRealPath("upload");
                            OutputStream out = new FileOutputStream(path_store
                                    + "/" + fileName);
                            // 直接将文件copy到指定位置
                            IOUtils.copy(in, out);
                            // 关闭流
                            in.close();
                            out.close();
                            // 删除临时文件 这里没有设置 可以不用删除 设置了临时文件需要删除
                            // item.delete();
                        }
                    }

                } else {
                    // 不是文件上传表单
                    // 使用原始表单数据获取方式---request.getParameter();
                }
            }
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

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

}
4.相关的API介绍

    (1)DiskFileItemFactory:磁盘文件项工厂--一些相关的配置的设置  缓存的大小 临时目录的位置

        ①.设置缓存大小:factory.setSizeThreshold() 单位是字节

        ②.设置临时文件的目录:factory.setRepository(File)  


    (2)ServletFileUpload:文件上传核心类,可以获取所有的FileItem对象

        ①.解析request获得表单项的集合:upload.parseRequest(request);

        ②.判断是否是一个文件上传的表单:upload.isMultipartContent(request);

        ③.设置单个上传文件的最大值:upload.setFileSizeMax(fileSizeMax);
        ④.设置总上传文件的最大值:upload.setSizeMax(sizeMax);

        ⑤.设置上传文件名的编码:upload.setHeaderEcoding("UTF-8");

    (3)FileItem:封装了普通表单项的值以及文件上传表单元素的值

        ①.判断是否是普通表单项:item.isFormField();

        ②.获得表单的name属性值:item.getFieldName();

        ③.获得表单的value值:item.getString("UTF-8") --- UTF-8表示获得中文时的编码

        ④.获得上传文件的名称:item.getName()

        ⑤.获得上传文件:item.getInputStream();

        ⑥.删除临时文件:item.delete();