文档章节

JAVA 服务器端下载接口

 某科学的现代魔法
发布于 2017/06/05 10:24
字数 373
阅读 25
收藏 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
RPC框架实践之:Apache Thrift

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

CodeSheep
05/14
0
0
JComponentPack3.0正式发布

奇新Java控件---Java控件提供商和Java RIA, Web, J2ME解决方案开发商 我们为您提供了一系列方便易用的Java控件,帮助开发人员提高工作效率,加快开发进程。 最新动态: JComponentPack3.0正式...

fralepg
2009/04/11
0
0
Apache Thrift - 可伸缩的跨语言服务开发框架

前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大...

张升强
2015/05/15
0
0
JAVA RMI 远程接口调用

摘要:远程接口发布在192.168.100.2服务器上。服务端:192.168.100.2客户端:192.168.100.1服务器之前通讯正常。 在客户端编码: package com.itf; import java.rmi.Remote;/** 远程接口定义...

小乞丐
2012/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

简单谈一谈压力测试

最近,在做API的压力测试,趟了不少坑,然后呢,简要记录一下。 压测前需要准备的一些事 拿到API文档不要立马上手,先基准测试,就是执行一次接口测试,至少要压这个接口,要先熟悉一下他的参...

浮躁的码农
48分钟前
0
0
PHP 错误调查

一.定义:PHP错误是由PHP无法读懂执行的代码引起的错误。 二:错误日志 error log 1.在php.ini 里设置 log_errors = on, log文件位置 error_log=/tmp/php_errors.log 2.代码里设置ini_set('...

忙碌的小蜜蜂
51分钟前
1
0
knn算法

import numpy as np def CreateDateSet(): group = np.array([[1.0, 2.0], [1.2, 0.1], [0.1, 1.4], [0.3, 3.5]]) labels = ['A','A','B','B'] return group,labels coding:utf-8 from numpy......

南桥北木
51分钟前
1
0
自己手写一个 SpringMVC 框架

前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课. Spring 框架对于 Java 后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,...

别打我会飞
今天
2
0
01-《Apache Tomcat 9》之文件索引

《Apache Tomcat 9》是《看Apache官方文档学英语》的第一个专栏!让我们一起在看文档的过程中学英语,在学英语的过程中夯实技术! Documentation Index - 文件索引 Introduction - 介绍 This...

飞鱼说编程
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部