文档章节

JAVA 服务器端下载接口

 某科学的现代魔法
发布于 2017/06/05 10:24
字数 373
阅读 9
收藏 0
点赞 0
评论 0

 java读取服务器文件,传输给客户端代码。

public  static void download(String path, HttpServletResponse res,
			HttpServletRequest req,String fileOldName) {
		BufferedOutputStream bos = null;
		RandomAccessFile oSavedFile = null;
		try {
			if(StringUtil.isEmpty(path)){
				res.setStatus(HttpServletResponse.SC_NOT_FOUND);
				return;
			}
			File file = new File(path);
			if (file.exists()) {
				String range = req.getHeader("Range");
				String fileName = file.getName();
				long fileLength = file.length();
				long fileStart = 0;
				long fileEnd = fileLength - 1;
				String lastModified=String.valueOf(file.lastModified());
				String ifModifiedSince=req.getHeader("If-Modified-Since");
				//判断资源是否修改,允许读取缓存
				if(lastModified!=null&&lastModified.equals(ifModifiedSince)){
					//304
					res.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
					return;
				}

				// 头消息读取
				if (range != null && range.indexOf("=") > 0) {
					fileStart = Long.parseLong(range.substring(
							range.indexOf("=") + 1, range.indexOf("-")).trim());
					if (range.indexOf("-") + 1 < range.length()) {
						fileEnd = Long.parseLong(range.substring(
								range.indexOf("-") + 1).trim());
					}
				}
				long contentLenth = fileEnd - fileStart + 1;
				res.reset();
				//设置文件Content-Type(Mime-Type),此处为通用
				res.setContentType("application/octet-stream");
				res.addHeader("Connection", "keep-alive");
				//允许部分下载
				res.addHeader("Accept-Ranges", "bytes");
				//允许浏览器缓存
				res.addHeader("Last-Modified",lastModified);
				//设置名称,此处判断是否需要改名为原名
				res.addHeader("Content-disposition", "attachment;filename=\""
						+ (fileOldName==null?fileName:fileOldName )+ "\"");
				//判断是否只需部分,允许部分下载
				if (!StringUtils.isEmpty(range)) {
					res.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
				}
				//请求的内容长度
				res.addHeader("Content-length", contentLenth + "");
				//在整个返回体中本部分的字节位置
				res.addHeader("Content-Range", "bytes " + fileStart + "-"
						+ fileEnd + "/" + fileLength);
				
				OutputStream ops = res.getOutputStream();
				byte[] buffer = new byte[8 * 1024];
				bos = new BufferedOutputStream(ops);				 
				oSavedFile = new RandomAccessFile(file, "r");
				oSavedFile.seek(fileStart);
				
				while ( oSavedFile.read(buffer) != -1) {
					bos.write(buffer);
					//从总长度中减去已读取长度
					contentLenth -= buffer.length;
					//判读剩余长度是否满足byte[]长度
					if (contentLenth <= buffer.length) {
						//若读完就结束
						if (contentLenth <= 0) {
							break;
						}
						//读取剩余长度后结束
						buffer = new byte[(int) contentLenth]; 
						oSavedFile.read(buffer);
						bos.write(buffer);
						break;
					}
				}

			}else{
				res.setStatus(HttpServletResponse.SC_NOT_FOUND);
				return;
			}
		} catch (Exception e) {
			
				e.printStackTrace();

		} finally {
			try {
				if (oSavedFile != null) {
					oSavedFile.close();
				}
				if (bos != null) {
					bos.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	};

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 1
码字总数 373
作品 0
无锡
RMI:Java中的分布式计算框架

RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实...

qq_39521554 ⋅ 05/15 ⋅ 0

Java就业变难了?你需要对自己有点信心

伴随着IT的火热,越来越多的人进入了IT领域,这在进一步推动着IT发展的同时也极大增加了就业压力。伴随着激烈的岗位竞争,越来越多的人开始感叹工作难找,越火的行业越是如此,Java自是首当其...

糖宝_d864 ⋅ 06/08 ⋅ 0

【J2EE】之常用的接口和协议

前言 初接触J2EE,会遇到很多之前没有遇到过的术语,下面我们来简单地汇总一下这些接口和协议吧。 各大接口和协议详解 JDBC 1.定义:Java数据库连接 2.地位:用于Java应用程序连接数据库的标...

m18633778874 ⋅ 04/26 ⋅ 0

RPC框架实践之:Apache Thrift

一、概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务。在文章 微服务调用链追踪中心搭建 一文中模拟出来的调用链:...

CodeSheep ⋅ 05/14 ⋅ 0

甲骨文开源Java 性能监控调试工具 JMC

JMC (Java Mission Control) 是Oracle开源的Java 性能监控调试工具, 源自 JRockit JVM , 主要由三个组件构成:Java 进程浏览器、JMX 控制台和 Java Flight 记录器。 主要特性: Java 进程浏览...

marsdream ⋅ 05/07 ⋅ 0

重磅!Java 性能监控调试工具 JMC 宣布开源

JRockit JVM 创始人之一、Oracle Java 产品组成员 Marcus Hirt 昨日在其博客上宣布,Java Mission Control(JMC)的源代码已正式开源。 JMC 是源自 JRockit JVM 的一套监控和管理工具,Oracl...

王练 ⋅ 05/07 ⋅ 6

java程序员基础进阶篇,万丈高楼平地起

一.final,finally,finalize 三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这...

启示录是真的 ⋅ 05/26 ⋅ 0

SWIG与JAVA 交互最全开发指南一

项目背景 最近开始研究做移动端项目,但是本人基本是做了五六年的c++的底层研发,对C++的研发可以说是驾轻就熟了,但是对于android还是属于刚入门阶段,虽然断断续续做移动端也做了一年,但是...

揽月凡尘 ⋅ 06/16 ⋅ 0

Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神 ⋅ 05/08 ⋅ 0

做几道基础的Java测试题,看看最近有进步吗?欢迎来学习

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

启示录是真的 ⋅ 05/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iExec Blockchain Marketplace for Cloud

iExec Releases the First-Ever Blockchain Marketplace for Trading Cloud Computing Berlin, Germany, May 29, 2018. iExec has released its blockchain-based decentralized cloud marke......

openthings ⋅ 10分钟前 ⋅ 0

OSChina 周二乱弹 —— 加班的代码不要枉费了我的童子功

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《29》- 未完成乐队 《29》- 未完成乐队 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :#看球提醒# 02:00 巴西v...

小小编辑 ⋅ 29分钟前 ⋅ 11

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 今天 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部