第十一章_文件下载

2024-08-22 23:48
文章标签 下载 第十一章

本文主要是介绍第十一章_文件下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

11.1、文件下载概述

1、将响应的内容类型设置为文件的内容类型。标头Content-type用来规定实体主体中的数据类型,包含媒体类型和子类型标识符。

2、添加一个名为Content-DispositionHTTP响应头,给它赋值attachmentfilename=filename,这里的fileName是指在文件下载对话框中显示出来的默认文件名。它通常与文件名相同,但是也可以不同。

例如,以下就是将一个文件发送到浏览器的代码范例。

FileInputStream fis = new FileInputStream(file) ;

BufferedInputStream bis = new BufferedInputStream(fis) ;

byte[] bytes = new byte[bis.available()] ;

response.setContentType(contentType) ;

OutputStream os = response.getOutputStream() ;

bis.read(bytes) ;

os.write(bytes) ;

警告:一定要确保你没有在无意中发送超出实际文件内容以外的任何字符。这有可能在你毫不知情的情况下发生。例如,如果需要在JSP页面中使用page指令,可以这么写:

<%@ page import=”java.io.FileInputStream”%>

<jsp:useBean id=”DBBeanId” scope=”page” class=”MyBean”>

在你毫不察觉的情况下,page指令后面的回车换行符就会被发送给浏览器。为了防止发送多余的字符,需要像下面这样编写这个指令:

<%@ page import=”java.io.FileInputStream”

%><jsp:useBean id=”DBBeanId” scope=”page” class=”MyBean”>

 

11.2、范例1:隐藏资源

在下面这个程序中,我们用一个FileDownloadServlet servletsecret.pdf文件发送到浏览器。但是,只有授权用户才能浏览。如果用户没有登录,应用程序就会跳转到Login页面。在这里,用户可以在表单中输入用户名和密码,这些内容都将被提交给另一个ServletLoginServlet

LoginServlet.java

package filedownloaded;import java.io.IOException;import javax.servlet.RequestDispatcher;
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 javax.servlet.http.HttpSession;
@WebServlet(urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet{private static final long serialVersionUID = 1L;public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {String userName = request.getParameter("userName") ;String password = request.getParameter("password") ;if(userName != null && userName.equals("ken")&& password != null && password.equals("secret")){HttpSession session = request.getSession(true) ;session.setAttribute("loggedIn", Boolean.TRUE);response.sendRedirect("download");return ;}else{RequestDispatcher dispatcher = request.getRequestDispatcher("/login.jsp") ;dispatcher.forward(request, response);}}}

login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="login" method="post"><table><tr><td>User name: </td><td><input name="userName"/></td></tr><tr><td>Password: </td><td><input name="password" type="password"/></td></tr><tr><td colspan="2"><input type="submit" value="login"/></td></tr></table></form></body>
</html>
FileDownloadServlet.java

package filedownloaded;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;import javax.servlet.RequestDispatcher;
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 javax.servlet.http.HttpSession;
@WebServlet(urlPatterns = {"/download"})
public class FileDownloadServlet extends HttpServlet{private static final long serialVersionUID = 1L;@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {HttpSession session = req.getSession() ;if(session == null || session.getAttribute("loggedIn") == null){RequestDispatcher dispatcher = req.getRequestDispatcher("/login.jsp") ;dispatcher.forward(req, resp); return ;}String dataDirectory = req.getServletContext().getRealPath("/WEB-INF/data") ;File file = new File(dataDirectory, "secret.pdf") ;if(file.exists()){resp.setContentType("application/pdf");resp.addHeader("Content-Disposition", "attachment; filename=secret.pdf");byte[] buffer = new byte[1024] ;try(FileInputStream fis = new FileInputStream(file) ;BufferedInputStream bis = new BufferedInputStream(fis);OutputStream os = resp.getOutputStream()){int i = bis.read(buffer) ;while(i != -1){os.write(buffer, 0, i);i = bis.read(buffer) ;}}catch(IOException e){e.printStackTrace();}}}}

12.3、范例2:防止跨站引用

竞争对手很可能试图通过跨站引用来“窃取”你的网络资产,例如将你的贵重物品显示在他们的网站上,好像哪些东西就是他们的一样,如果通过编程的方式,仅当referer标头中包含你的域名时才发送资源,那么就可以防止上述情况的发生。当然,那种意志坚定的窃贼还是有可能下载到你的资产,但是那就要费一番功夫了。

下面的应用使用了一个Servlet,当且仅当referer标头不为空时,才将图片发送到浏览器。这样就可以防止直接在浏览器中输入其网址就能下载到图片。

ImageServlet.java

package filedownloaded;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = {"/getImage"})
public class ImageServlet extends HttpServlet{private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{String referer = request.getHeader("referer") ;if(referer != null){String imageId = request.getParameter("id") ;String imageDirectory = request.getServletContext().getRealPath("/WEB-INF/image") ;File file = new File(imageDirectory, imageId + ".jpg") ;if(file.exists()){response.setContentType("image/jpg");byte[] buffer = new byte[1024] ;try(FileInputStream fis = new FileInputStream(file) ;BufferedInputStream 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(IOException e){e.printStackTrace();}}}}}

images.html

<!DOCTYPE html>
<html><head><title>images.html</title><meta name="keywords" content="keyword1,keyword2,keyword3"><meta name="description" content="this is my page"><meta name="content-type" content="text/html; charset=UTF-8"><!--<link rel="stylesheet" type="text/css" href="./styles.css">--></head><body><img src="getImage?id=1"/><img src="getImage?id=2"/><img src="getImage?id=3"/><img src="getImage?id=4"/><img src="getImage?id=5"/><img src="getImage?id=6"/><img src="getImage?id=7"/><img src="getImage?id=8"/><img src="getImage?id=9"/><img src="getImage?id=10"/></body>
</html>

这样就能避免其他网站使用爬虫等技术进行图片下载。直接复制图片地址是访问不到图片的。

这篇关于第十一章_文件下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097747

相关文章

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

python 3.8 的anaconda下载方法

《python3.8的anaconda下载方法》本文详细介绍了如何下载和安装带有Python3.8的Anaconda发行版,包括Anaconda简介、下载步骤、安装指南以及验证安装结果,此外,还介... 目录python3.8 版本的 Anaconda 下载与安装指南一、Anaconda 简介二、下载 An

Java下载文件中文文件名乱码的解决方案(文件名包含很多%)

《Java下载文件中文文件名乱码的解决方案(文件名包含很多%)》Java下载文件时,文件名中文乱码问题通常是由于编码不正确导致的,使用`URLEncoder.encode(filepath,UTF-8... 目录Java下载文件中文文件名乱码问题一般情况下,大家都是这样为了解决这个问题最终解决总结Java下

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/