第十二章节-下载文件

图片或者HTML文件这样的静态资源 ,在浏览器中打开 正确的URL就可以下载,只要资源是放在应用程序的目录下面,或者是应用程序的子目录下面,而不是放在WEB-INF下,Servlet/jsp容器就

会将这个资源发送到浏览器。然而,有时候静态资源是保存一应用程序目录以外或者是数据库中,则要通过编程来发送资源。

例子

  • 工程目录 

  • ResourceController
@Controller
public class ResourceController {
	private static final Log logger = LogFactory.getLog(ResourceController.class );

	@RequestMapping(value ="/login")
	public String login(@ModelAttribute Login login, HttpSession session, Model model){
		model.addAttribute("login" , new Login()) ; // for what
		if ("lsj".equals(login.getUserName())&& "123".equals(login.getPassword())){
			session.setAttribute("loggedIn", Boolean.TRUE);
			return "Main";
		}else {
			return "LoginForm";
		}
	}

	@RequestMapping(value="/resource_download")
	public String downloadResource(HttpSession session, HttpServletRequest request,
			HttpServletResponse response){
		if (session== null || session.getAttribute("loggedIn")==null){
			return "LoginForm";
		}
		String dataDir= request.getServletContext().getRealPath("/WEB-INF/data") ;
		File file = new File(dataDir , "secret.pdf") ;
		if (file.exists()){
			response.setContentType("application/pdf");
			response.addHeader("Content-Disposition",
					"attachment; filename=secret.pdf");
			byte [] buffer = new byte[1024];
			FileInputStream fis = null;
			BufferedInputStream bis = null;
			try {
				fis = new FileInputStream(file) ;
				bis = new BufferedInputStream(fis ) ;
				OutputStream os = response.getOutputStream() ;
				int i = bis.read(buffer);
				while (i!= -1) {
					os.write(buffer , 0, i);
					i = bis.read(buffer);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				if (bis!= null){
					try {
						bis.close();
					} catch (IOException e2) {

					}
				}
				if (fis!= null){
					try {
						fis.close();
					} catch (IOException e2) {

					}
				}
			}
		}
		return null;//不进行跳转
	}
}
  • Login
public class Login  implements Serializable {
    private static final long serialVersionUID = -38L;

    private String userName;
    private String password;

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
  • LoginForm.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
<head>
<title>Login</title>
<style type="text/css">@import url("<c:url value="/css/main.css"/>");</style>
</head>
<body>
<div id="global">
<form:form commandName="login" action="login" method="post">
    <fieldset>
        <legend>Login</legend>
        <p>
            <label for="userName">User Name: </label>
            <form:input id="userName" path="userName" cssErrorClass="error"/>
        </p>
        <p>
            <label for="password">Password: </label>
            <form:password id="password" path="password" cssErrorClass="error"/>
        </p>
        <p id="buttons">
            <input id="reset" type="reset" tabindex="4">
            <input id="submit" type="submit" tabindex="5"
                value="Login">
        </p>
    </fieldset>
</form:form>
</div>
</body>
</html>
  • Main.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML>
<html>
<head>
<title>Download Page</title>
<style type="text/css">@import url("<c:url value="/css/main.css"/>");</style>
</head>
<body>
<div id="global">
    <h4>Please click the link below.</h4>
    <p>
        <a href="resource_download">Download</a>
    </p>
</div>
</body>
</html>

  

  

  

时间: 2024-10-05 04:19:30

第十二章节-下载文件的相关文章

Netty in Action (二十三) 第十二章节 WebSocket

第三部分:网络协议 WebSocket是一个先进的网络协议,被开发用来用来提高网络的性能和web应用的响应率,我们将介绍Netty对WebSocket这两个特性的支持,同时我们也会举一个简单的实例来说明讲解这两个WebSocket的特性 在第十二章节中,你将学会如何使用WebSocket实现数据双向传输的功能,我们会写一个聊天室的方式讲解这个数据双向传输的问题,我们这个聊天室的实例是这样的:多个浏览器客户端可是实时的相互通信,你也会学会如何将普通的HTTP协议切换升级成WebSocket协议,当

Linux常用命令(十二)日志文件分析

? ? ? ? ? ? ? ? ? ? ? ? Linux常用命令(十二)日志文件分析 日志文件是用于记录Linux系统中各种运行消息的文件,相当于Linux主机的"日记".不同的日志文件记载了不同类型的信息,如Linux内核消息.用户登录事件.程序错误等. 一.主要日志文件 ???? ? ? ? 在Linux系统中,日志数据主要包括以下三种类型. ■ 内核及系统日志: 这种日志数据由系统服务rslslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消

第二十二章 Linux文件比较,文本文件的交集、差集与求差:comm命令

第二十二章 Linux文件比较,文本文件的交集.差集与求差:comm命令 名词解释 comm 命令 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.差集操作. 交集:打印两个文件所共有的行 求差:打印出指定文件所包含的其不相同的行. 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行. 语法 comm(选项)(参数) 选项 -1 :不显示在第一个文件出现的内容: -2 :不显示在第二个文件中出现的内容: -3 :不显示同时在两个文件中都出现的内容. ? 参数

salesforce 零基础学习(四十二)简单文件上传下载

项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文件上传到Document对象中. 一.文件上传功能 apex代码 1 public with sharing class FileUploadUsedTransientController { 2 3 public transient Blob fileUploadBody{get;set;} 4

第十二章 Python文件操作

12.1 open() open()函数作用是打开文件,返回一个文件对象. 用法格式:open(name[, mode[, buffering[,encoding]]]) -> file object name 文件名 mode 模式,比如以只读方式打开 buffering 缓冲区 encoding 返回数据采用的什么编码,一般utf8或gbk Mode Description r 只读,默认 w 只写,打开前清空文件内容 a 追加 a+ 读写,写到文件末尾 w+ 可读写,清空文件内容 r+ 可

Python 学习笔记(十二)Python文件和迭代(一)

文件 文件和文件夹 文件:文本文件.二进制文件 文件夹:(windows) G:\pythonWorkspace\python\study (linux/mac) /home/workspace/python 注意:文件夹路径的斜杠linux与windows不同 windows下文件路径:示例 1 >>> p1="G:\pythonWorkspace\python\study\test.txt" 2 >>> p2 =r"G:\pythonW

CCNA学习指南 第十二章 下载 (全书完)

按照规模大小通常把计算机网络划分为局域网(LAN)和广域网(WAN),"广域网(WAN)"这个术语和概念从此被人们所熟知,但本章所谈的"广域网"主要涉及广域网服务和广域网接入技术(方法).

【android】下载文件至本应用程序的file文件夹或者sdcard

 一.推断是否有sdcard卡 //推断是否有SD卡 //ture:有SD卡 //false:没有SD卡 public boolean avaiableMedia(){ String status=Environment.getExternalStorageState(); if(status.equals(Environment.MEDIA_MOUNTED)){ return true; } else { return false; } } 二.下载文件至sdcard卡 if(avaiab

【android】下载文件至本应用程序的file目录或者sdcard

 一.判断是否有sdcard卡 //判断是否有SD卡 //ture:有SD卡 //false:没有SD卡 public boolean avaiableMedia(){ String status=Environment.getExternalStorageState(); if(status.equals(Environment.MEDIA_MOUNTED)){ return true; } else { return false; } } 二.下载文件至sdcard卡 if(avaiab