基于Java与JSP的文件上传和下载

概念

当用户在前端页面点击文件上传后,用户上传的文件数据提交给服务器端,实现保存。

文件上传步骤

提交方式:

提供form表单,method必须是post。因为post请求无数据限制。

<form method="post"></form>

提交数据格式:

表单的enctype属性值必须为multipart/form-data.

以多段的形式进行拼接提交。以二进制的方式来处理表单数据,会把指定的文件内容封装进请求参数中。

<form enctype="multipart/form-data" method="post"></form>

提供组件:

提供file表单组件,提供给用户上传文件。

解决文件上传命名重复问题:

当上传重复的文件时,为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。

public class UploadUtls{

        //使用UUID生成唯一标识码,并拼接上图片的名称

        public static String NewFileName(String fileName){

                return UUID.randomUUID().toString.replaceAll("-","")+"_"+fileName;

        }

}

upload.jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传页面</title>
</head>
<body>
  <form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">
      用户名: <input type="text" name="username"> <br>
      选择文件: <input type="file" name="file"> <br>
      <input type="submit" value="上传">
  </form>
</body>
</html>

UploadController.java代码(注意:上传成功后创建的文件夹与文件在真实的文件目录下,即out目录下)

import com.tyh.utils.UploadUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;

//实现文件上传
@WebServlet(name = "UploadController",value = "/upload")
//文件注解,maxFileSize单个文件上传空间大小,maxRequestSize多个文件总共上传空间大小
@MultipartConfig(maxFileSize = 1024*1024*100,maxRequestSize = 1024*1024*200)
public class UploadController extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        //获取请求的数据
        String username = req.getParameter("username");
        //获取文件上传的数据
        Part part = req.getPart("file");

        //获取上传文件的路径 真实路径
        String uploadPath = req.getServletContext().getRealPath("/WEB-INF/upload");
        File file = new File(uploadPath);
        if (!file.exists()){
            //不存在则新建文件夹
            file.mkdirs();
        }

        //文件上传
        //生成唯一文件名
        String oldName = part.getSubmittedFileName();
        String newName = UploadUtils.newFileName(oldName);
        part.write(uploadPath+"\\"+newName);

        //响应客户端 上传成功
        resp.getWriter().println(part.getSubmittedFileName()+"上传成功!");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

 文件类型限制:

要限制上传文件地类型,在收到上传文件名时,判断后缀名是否合法。

//创建一个集合存放允许上传的文件地类型(后缀名)

//判断所上传的文件在当前集合中是否包含

LIst<String> nameList = new ArrayList<String>();

nameList.add(".jpg");

nameList.add(".png");

nameLiat.add(".jpeg");

String newName = fileName.substring(fileName.lastIndex("."));

if(!nameList.contains(newName)){

        response.getWriter().println(fileName+"不符合文件上传规则!");

        return;

}

多文件上传: 

1.利用request.getParts()获取文件集并存储到Collection集合中,

2.利用增强for循环遍历集合中的每个文件对象

3.然后同以上单个上传文件原理一样,依次逐个上传文件

JSP页面代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传页面</title>
</head>
<body>
  <form action="${pageContext.request.contextPath}/moreUpload" enctype="multipart/form-data" method="post">
      选择文件: <input type="file" name="file"> <br>
      继续选择文件: <input type="file" name="file2"> <br>
      <input type="submit" value="上传">
  </form>
</body>
</html>

Servlet代码

import com.tyh.utils.UploadUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.Collection;

//多文件上传
@WebServlet(name = "MoreUploadController",value = "/moreUpload")
@MultipartConfig(maxFileSize = 1024*1024*100,maxRequestSize = 1024*1024*200)
public class MoreUploadController extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        //获取上传文件的路径 真实路径
        String uploadPath = req.getServletContext().getRealPath("/WEB-INF/upload");
        File file = new File(uploadPath);
        if (!file.exists()){
            //不存在则新建文件夹
            file.mkdirs();
        }

        //获取表单提交的所有数据
        Collection<Part> parts = req.getParts();

        for (Part part : parts){
            String fileName = part.getSubmittedFileName();
            if (fileName != null){//文件
                //未选择文件
                if (fileName.trim().equals("")){
                    continue;
                }
                //依次循环上传文件
                String newName = UploadUtils.newFileName(fileName);
                //上传文件
                part.write(uploadPath+"\\"+newName);

                //响应客户端 上传成功
                resp.getWriter().println(part.getSubmittedFileName()+"上传成功!");
            } else {//普通表单项
                String username = req.getParameter(part.getName());
                System.out.println(username);
            }
        }
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

文件下载:

显示文件下载列表:

我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作。

获取文件列表工具类 DownLoadUtils.java

import java.io.File;
import java.util.HashMap;

//循环查找指定目录下所有文件
public class DownLoadUtils {
    public static void getFileList(File file, HashMap<String,String> fileMap){
        //获取文件集合
        File[] files = file.listFiles();
        
        for (File f : files){
            if (f.isDirectory()){//目录
                getFileList(file,fileMap);
            } else {//文件
                String fileName = f.getName();
                //截取文件名
                int index = fileName.lastIndexOf("_");
                String realName = fileName.substring(index + 1);
                fileMap.put(fileName,realName);
            }
        }
    }
}

获取文件列表控制层类 FileListController.java

import com.tyh.utils.DownLoadUtils;

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 java.io.File;
import java.io.IOException;
import java.util.HashMap;

//获取下载列表
@WebServlet(name = "FileListController",value = "/fileList")
public class FileListController extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //集合Map key=UUID value=源文件名称
        HashMap<String,String> fileMap = new HashMap<>();
        String basePath = req.getServletContext().getRealPath("/WEB-INF/upload");

        //将查找到的文件添加到Map中
        DownLoadUtils.getFileList(new File(basePath),fileMap);

        //存储数据
        req.setAttribute("fileMap",fileMap);
        req.getRequestDispatcher("/fileUpload/fileList.jsp").forward(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

显示文件列表页面 fileList.jsp

实现下载文件功能:

为fileList.jsp文件中的超链接标签加上url地址

<a href="${pageContext.request.contextPath}/downLoad?filename=${entry.key}">下载</>

实现下载文件类DownLoad.java

 

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

//下载文件
@WebServlet(name = "DownLoad",value = "/downLoad")
public class DownLoad extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //设置编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //获取下载目录
        String basePath = req.getServletContext().getRealPath("/WEB-INF/upload");

        //获取Request中的文件filename的UUID
        String uuidFileName = req.getParameter("filename");
        //利用截取获取文件名
        String filename = uuidFileName.split("_")[1];

        //设置响应头,响应的文件类型和处理该文件 附件下载
        resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));

        //通过输入输出流将源文件下载
        FileInputStream is = new FileInputStream(basePath+"\\"+uuidFileName);
        ServletOutputStream out = resp.getOutputStream();
        byte[] buffer = new byte[1024*1024*100];
        int len = 0;
        while ((len = is.read(buffer)) != -1){
            out.write(buffer,0,len);
        }

        //关闭流
        out.close();
        is.close();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T何必当初

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值