文档章节

JAVA 服务器端下载接口

 某科学的现代魔法
发布于 2017/06/05 10:24
字数 373
阅读 35
收藏 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
0
java RMI 源码总结(个人理解)

明天早上详细写下两个过程: 1、初始化过程(服务器) 2、客户端调用过程(包括客户端流程、调用服务端流程、返回客户端流程) 当客户端通过RMI注册表找到一个远程接口的时候,所得到的其实是...

Java搬砖工程师
11/16
0
0
thrift rpc js使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/byxdaz/article/details/84871376 一、thrift js使用方式 使用thrift js时,PRotocol需要使用TJSONPRotocol/T...

byxdaz
12/07
0
0
thrift服务(for Python/Java)的简易搭建步骤(不求甚解版)

关于这个话题,网上有大量的文章;但是配置部分都讲得比较混乱,直接拷来并不能跑通。 本文以python和java分别作为服务端/客户端及其逆形式进行了演示,不求甚解,只求能用。 定义好thrift文...

虎哥_huge
2017/11/05
0
0
Java学习笔记(1) --JSE 、JEE、 JME三者的区别

java SE : java standard edition , JSE。它允许允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的java应用程序。 java SE包含了java Web 服务开发的类,并为java platform ,e...

hellation_
11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

git常用命令

1.查看远程仓库地址 git remote -v 2.创建本地分支 git branch 分支 3.切换分支 git checkout 分支 4.把分支放到远程 git push origin 分支 5.查看本地分支 git branch 6. 查看本地和远程分支...

熊小熊会写代码哦
4分钟前
1
0
离屏Canvas — 使用Web Worker提高你的Canvas运行速度

现在因为有了离屏Canvas,你可以不用在你的主线程中绘制图像了! Canvas 是一个非常受欢迎的表现方式,同时也是WebGL的入口。它能绘制图形,图片,展示动画,甚至是处理视频内容。它经常被用...

嫣然丫丫丫
6分钟前
1
0
SpringBoot 整合 BeetlSQL

SpringBoot 整合 BeetlSQL 1. beetlsql介绍 BeetSql是一个全功能DAO工具, 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应...

Jeff_Regan
7分钟前
1
0
UNIGUI-DBGRID的统计行的使用

关键步骤: 1、设置DBGRID的summary.enabled:=true 2、打开DBGRID的columns字段,设置DBGRID对应的column的showsummary:=true; 3、写入uniDBGRID.onColumnSummary事件: procedure TframeCa......

dillonxiao
9分钟前
1
0
MySQL语法速查1:基础命令篇

[TOC] 1.1. 关于 SQL SQL 是 Structure Query Language(结构化查询语言)的缩写,是关系型数据库的基本语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型...

whoru
14分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部