Jsp+Servlet实现文件上传下载(四)--下载文件
接着上一篇讲:
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实现文件上传下载(四)--下载文件的更多相关文章
- HTTP文件上传服务器-支持超大文件HTTP断点续传的实现办法
最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传.笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文件上传的一些基本 ...
- SpringBoot - 实现文件上传2(多文件上传、常用上传参数配置)
在前文中我介绍了 Spring Boot 项目如何实现单文件上传,而多文件上传逻辑和单文件上传基本一致,下面通过样例进行演示. 多文件上传 1,代码编写 1)首先在 static 目录中创建一个 up ...
- php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
网上有很多php文件上传的类,文件上传处理是php的一个特色(至少手册上是将此作为php特点来展示的,个人认为php在数组方面的优异功能更有特 色),学php的人都知道文件上传怎么做,但很多人在编程中 ...
- django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法
django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...
- PHP实现单文件、多文件上传 封装 面向对象实现文件上传
文件上传配置 客户端配置 1.表单页面 2.表单的发送方式为post 3.添加enctype = "multipart/form-data" <form action=&qu ...
- jsp/servlet实现简单上传和下载
使用JSP/Servlet简单实现文件上传与下载 jsp上传页面代码: <%@ page language="java" import="java.util.*&q ...
- Servlet实现文件上传,可多文件上传
一.Servlet实现文件上传,需要添加第三方提供的jar包 接着把这两个jar包放到 lib文件夹下: 二: 文件上传的表单提交方式必须是POST方式, 编码类型:enctype="mul ...
- Struts2实现文件上传(四)
Struts2实现文件上传 配置文件struts.xml <!-- /* * $Id: struts.xml 1364077 2012-07-21 12:57:02Z lukaszlenart ...
- IE8+SpringMVC文件上传防止JSON下载
今天在IE8测试文件上传的时候发现总是提示下载,原因是上传接口返回的是json,通过以下修改就可以保证返回是json并且不会出现下载的情况: @RequestMapping(value = " ...
- spring mvc ajaxfileupload文件上传返回json下载问题
问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/ad ...
随机推荐
- [转帖]tidb RESTORE
https://docs.pingcap.com/zh/tidb/v4.0/sql-statement-restore RESTORE 语句用于执行分布式恢复,把 BACKUP 语句生成的备份文件恢复 ...
- 不同linux发行版 FIO测试结果总结
不同linux发行版 FIO测试结果总结 背景 机器来源 配置: 2路28核心Golden 6330 2.0Ghz 512G内存 硬盘 24块 960G SSD (22块 Raid5 + 2块 hot ...
- [转帖]SQL Server超过了每行的最大字节数(8060)的原因和解决办法
一.现象 出现这种错误都发生在SQL语句建表时,错误提示: "警告: 已创建表 'XXXX,但其最大行大小(10438)超过了每行的最大字节数(8060).如果结果行长度超过 806 ...
- 【转帖】python 安装whl文件
前言 WHL文件是以Wheel格式保存的Python安装包,Wheel是Python发行版的标准内置包格式.在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的p ...
- Linux 通过命令方式反编译jar包的方法
第一步: 复制jar包到指定路径. find . -iname "*.jar" -exec scp {} /root/bf/ \; 第二步: 解压缩jar包解压缩出来class文件 ...
- 兄弟组件互相传递值-this.$bus.$emit与this.$bus.$on
B组件向C组件传递一个值. 一种组件间通信的方式, 适用于任意的组件间通信. 适用于任意的组件间通信. 适用于任意的组件间通信. 通过this.$bus.$emit('事件名',数据)进行提供数据 通 ...
- 学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学
学科知识图谱学习平台项目 :技术栈Java.Neo4j.MySQL等超详细教学 0.效果展示 1.安装教程 安装Java SDK 11,下载前需要登录Oracle账号,下载链接,安装教程,测试是否能在 ...
- C/C++ 文件与指针操作笔记
创建临时文件 #include <stdio.h> int main(int argc, char *argv[]) { FILE *temp; char c; if ((temp = t ...
- 曝iPhone 15系列将于9月13日发布 9月22日发售:7大升级、或售5999元起
按照往年惯例,新款iPhone将于9月中下旬(第三周)与大家见面.9to5Mac今日带来了新款iPhone的最新消息--iPhone 15系列将于9月13日发布,9月22日正式发售. 9to5Mac从 ...
- Tire树 学习笔记
定义与基本求法 定义 又称字典树,用边表示字母,从根节点到树上某一节点路径形成一个字符串. 例如 \(charlie:\) 基本求法 廷显然的,往树中存就行了,查询也是显然的,通过一道例题来理解吧: ...