【不用框架】文件上传和下载(四)

简介: 文件上传就是把用户的信息保存起来。

列出上传目录下的文件,提供下载

在讲解respose对象的时候已经讲解过文件下载了。这次我们就直接写一个小案例来巩固文件下载把。

  • 上传目录下的文件有3个

12.jpg

分析

首先,要把目录下的文件都列出来。由于后面要根据文件名对文件进行下载,所以我们用一个Map集合来保存所有的文件

下载文件部分也很简单,根据文件名和上传文件位置找到对应的文件,对其进行读写,然后修改消息头实现下载就好了。

  • 得到装载上传文件的路径,通过递归把所有的文件都查找出来(判断是否是文件就是递归出口),装载到Map集合中
  • 将Map集合传到前台做展示
  • 用户点击下载的时候,再根据原名来获取绝对路径
  • 如果该资源是存在的,就允许用户下载

代码

  • 将存放在WEB-INF/目录下的文件全部放在Map集合中
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到上传文件的目录
        String filePath = this.getServletContext().getRealPath("/WEB-INF/uploadFile");
        Map map = new HashMap();
        //使用递归来得到所有的文件,并添加到Map集合中
        getAllFiles(new File(filePath), map);
        request.setAttribute("map", map);
        request.getRequestDispatcher("/listFile.jsp").forward(request, response);
    }
    private void getAllFiles(File filePath, Map map) {
        //如果不是文件,那么它就是文件夹
        if (!filePath.isFile()) {
            //列出文件夹下所有的文件(可能是文件,可能是文件夹)
            File[] files = filePath.listFiles();
            for (File file : files) {
                //得到的文件(或者是文件夹)再对其进行判断
                getAllFiles(file, map);
            }
        } else {
            //进入到else语句了,肯定是文件了
            //得到文件名
            String fileName = filePath.getName().substring(filePath.getName().lastIndexOf("_") + 1);
            //我们将文件全名作为key,文件名作为value保存在map集合中
            map.put(filePath.getName(), fileName);
        }
    }

在JSP页面中显示可以下载的文件

<c:forEach items="${map}" var="me">
    <c:url var="url" value="/DownFileServlet">
        <c:param name="fileName" value="${me.key}"></c:param>
    </c:url>
    ${me.value}<a href="${url}">下载!</a><br>
</c:forEach>

实现下载的Servlet

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到文件的全名
        String fileName = request.getParameter("fileName");
        //如果是中文数据,需要转码。
        fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
        //得到保存文件的位置
        String path = this.getServletContext().getRealPath("/WEB-INF/uploadFile");
        //文件是通过文件名进行hashCode打散保存的,通过文件名拿到文件绝对路径
        String fileRealPath = makeFilePath(fileName, path);
        System.out.println(fileRealPath);
        //判断文件是否存在
        File file = new File(fileRealPath);
        if (!file.exists()) {
            request.setAttribute("message", "您要下载的资源不存在了!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return ;
        }
        //存在
        //读取该文件并把数据写给浏览器
        FileInputStream inputStream = new FileInputStream(fileRealPath);
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(bytes)) > 0) {
            response.getOutputStream().write(bytes, 0, len);
        }
        inputStream.close();
        //设置消息头,告诉浏览器,这是下载的文件
        String name = fileName.substring(fileName.lastIndexOf("_") + 1);
        response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(name, "UTF-8"));
    }
    private String makeFilePath(String fileName, String path) {
        int hashCode = fileName.hashCode();
        int dir1 = hashCode & 0xf;
        int dir2 = (hashCode & 0xf0) >> 4;
        String dir = path + "\\" + dir1 + "\\" + dir2 +"\\"+ fileName;
        return dir;
    }
目录
相关文章
|
6月前
|
PHP
thinkphp中自定义文件上传
thinkphp中自定义文件上传
39 0
|
1月前
|
监控 前端开发 安全
C#一分钟浅谈:文件上传与下载功能实现
【10月更文挑战第2天】在Web应用开发中,文件的上传与下载是常见需求。本文从基础入手,详细讲解如何在C#环境下实现文件上传与下载。首先介绍前端表单设计及后端接收保存方法,使用`&lt;input type=&quot;file&quot;&gt;`与`IFormFile`接口;接着探讨错误处理与优化策略,如安全性验证和路径管理;最后讲解文件下载的基本步骤,包括确定文件位置、设置响应头及发送文件流。此外,还提供了进阶技巧,如并发处理、大文件分块上传及进度监控,帮助开发者构建更健壮的应用系统。
95 15
|
6月前
|
Java
Struts文件上传与下载详解_上传单个文件
Struts文件上传与下载详解_上传单个文件
|
6月前
|
Java
Struts文件上传与下载详解 _上传多个文件
Struts文件上传与下载详解 _上传多个文件
|
6月前
|
JavaScript 前端开发
javaweb文件上传和下载
javaweb文件上传和下载
|
6月前
|
Java
Struts文件上传与下载详解_文件的下载
Struts文件上传与下载详解_文件的下载
|
Java 应用服务中间件
JavaWeb 文件上传和下载
JavaWeb——文件上传与下载 内容分享。
198 0
|
前端开发 Java Apache
文件上传与下载
文件上传与下载 文件上传也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。 文件上传时,对页面的form表单有如下要求: method=“post” 采用post方式提交数据 enctype=“multipart/form-data” 采用multipart格式上传文件 type=“file” 使用input的file控件上传
|
安全 Java Apache
【JavaWeb】之文件上传与下载
【JavaWeb】之文件上传与下载
406 0
【JavaWeb】之文件上传与下载
|
存储 前端开发 应用服务中间件
关于项目中文件上传
关于项目中文件上传
221 0