接着上一篇讲:

Jsp+Servlet实现文件上传下载(三)--删除上传文件    点击打开链接

本章来实现一下下载文件功能,同时优化了一下上一章中的代码。

废话少说,上代码

--------------------------------------------------------分割线---------------------------------------------------------------------------------

调整列表页面list.jsp,增加下载链接

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>上传文件列表</title>
</head>
<body> <h3>文件列表</h3>
<table class="acclist_tab" border="1" bordercolor="#000000" cellspacing="0" cellpadding="2" style="border-collapse:collapse;">
<tr>
<th>文件名</th>
<th>文件大小(KB)</th>
<th>操作</th>
</tr>
<c:if test="${not empty accessoryList}">
<c:forEach items="${accessoryList}" var="acc">
<tr>
<td>${acc.fileName}</td>
<td>${acc.fileSize}</td>
<td>
<a href="<%=request.getContextPath()%>/removeUploadedFile?id=${acc.id}">删除</a>  
<a href="<%=request.getContextPath()%>/downloadUploadedFile?id=${acc.id}">下载</a>
</td>
</tr>
</c:forEach>
</c:if>
</table>
</body>
</html>

新增下载文件控制器:DownloadUploadedFileServlet

package servlet.upload;

import dao.upload.AccessoryDao;
import entity.upload.EntityAccessory; 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.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder; /**
* 下载文件控制器
*
* @author xusucheng
* @create 2017-12-30
**/
@WebServlet("/downloadUploadedFile")
public class DownloadUploadedFileServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//拿到文件ID
int fileId = Integer.valueOf(request.getParameter("id"));
EntityAccessory entity = AccessoryDao.load(fileId);
String filePath = entity.getFilePath();
String fileName = entity.getFileName();
String errorMessage = "";
//判断文件是否存在
File file = new File(filePath);
if (file.exists()) {
//设置响应头
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//创建文件输入流
FileInputStream is = new FileInputStream(filePath);
//创建输出流
OutputStream os = response.getOutputStream();
//创建缓冲区
byte buffer[] = new byte[1024];
int len = 0;
//写数据到浏览器
while ((len = is.read(buffer)) > 0) {
os.write(buffer, 0, len);
}
//关闭流
is.close();
os.close();
} else {
errorMessage = "下载失败,文件:" + filePath + " 不存在";
request.setAttribute("errorMessage", errorMessage);
request.getRequestDispatcher("pages/upload/error.jsp").forward(request, response);
} } @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

优化了上一章servlet类名,调整为大写开头了

项目结构图

测试效果截图

下载失败提示:

下集预告

敬请期待。

Jsp+Servlet实现文件上传下载(四)--下载文件的更多相关文章

  1. HTTP文件上传服务器-支持超大文件HTTP断点续传的实现办法

    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传.笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文件上传的一些基本 ...

  2. SpringBoot - 实现文件上传2(多文件上传、常用上传参数配置)

    在前文中我介绍了 Spring Boot 项目如何实现单文件上传,而多文件上传逻辑和单文件上传基本一致,下面通过样例进行演示. 多文件上传 1,代码编写 1)首先在 static 目录中创建一个 up ...

  3. php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)

    网上有很多php文件上传的类,文件上传处理是php的一个特色(至少手册上是将此作为php特点来展示的,个人认为php在数组方面的优异功能更有特 色),学php的人都知道文件上传怎么做,但很多人在编程中 ...

  4. django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法

    django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...

  5. PHP实现单文件、多文件上传 封装 面向对象实现文件上传

    文件上传配置 客户端配置 1.表单页面 2.表单的发送方式为post 3.添加enctype = "multipart/form-data" <form action=&qu ...

  6. jsp/servlet实现简单上传和下载

    使用JSP/Servlet简单实现文件上传与下载 jsp上传页面代码: <%@ page language="java" import="java.util.*&q ...

  7. Servlet实现文件上传,可多文件上传

    一.Servlet实现文件上传,需要添加第三方提供的jar包 接着把这两个jar包放到 lib文件夹下: 二: 文件上传的表单提交方式必须是POST方式, 编码类型:enctype="mul ...

  8. Struts2实现文件上传(四)

    Struts2实现文件上传 配置文件struts.xml <!-- /* * $Id: struts.xml 1364077 2012-07-21 12:57:02Z lukaszlenart ...

  9. IE8+SpringMVC文件上传防止JSON下载

    今天在IE8测试文件上传的时候发现总是提示下载,原因是上传接口返回的是json,通过以下修改就可以保证返回是json并且不会出现下载的情况: @RequestMapping(value = " ...

  10. spring mvc ajaxfileupload文件上传返回json下载问题

    问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/ad ...

随机推荐

  1. [转帖]grafana自定义告警模版

     发表于 2022-03-16  更新于 2023-03-03 因 grafana 告警信息太多无用数据,容易干扰查看例如使用 企业微信告警消息如下太多无用Labels 例如 endpoint,job ...

  2. [转帖]Elasticsearch8关闭安全认证功能

    https://juejin.cn/post/7203637198120878137 Elasticsearch8在默认情况下是开启安全认证的.但在开发或者简单尝试时,希望关闭它. 关闭安全认证的方式 ...

  3. [转帖]SQL标准

    SQL 的标准 1986 年 10 月,美国国家标准协会 ANSI 采用 SQL 作为关系数据库管理系统的标准语言,并命名为 ANSI X3. 135-1986,后来国际标准化组织(ISO)也采纳 S ...

  4. [转帖]Native Memory Tracking 详解(2):追踪区域分析(一)

    https://www.modb.pro/db/529363 上篇文章 Native Memory Tracking 详解(1):基础介绍 中,分享了如何使用NMT,以及NMT内存 & OS内 ...

  5. [转帖]Traefik中诡异的502和504问题

    https://zhuanlan.zhihu.com/p/156138704 我们都知道在 Kubernetes 集群中通常会使用 Ingress 方案来统一代理集群内部的流量,而常用的 Ingres ...

  6. firewall-cmd 命令简单总结

    最近进行相关网络设置, 发现需要总结一下不然总是会忘记. # 1. 开放IP地址访问 firewall-cmd --zone=trusted --add-source=yourip --permane ...

  7. pytest单元测试基本使用

    一.pytest安装 pip install pytest:安装 pip install pytest==version:指定版本安装 pytest --version:查看版本 pip instal ...

  8. empty来显示暂无数据简直太好用,阻止用户复制文本user-select

    element-ui表格某一列无数据显示-- 很多时候,表格的某一列可能是没有数据的. 空着了不好看,ui小姐姐会说显示 -- 这个时候,小伙伴是怎么做的呢? 使用循环来判断是否为空,然后赋值为-- ...

  9. vue过滤器(filter)的使用

    过滤器分全局过滤器和局部过滤器 <div id="app"> <p>电脑价格:{{price | addPriceIcon}}</p> < ...

  10. List对象按属性排序

    1.Stream流sorted 正序: List<Person> collect = personList.stream().sorted(Comparator.comparing(Per ...