JAVA 服务器端下载接口
JAVA 服务器端下载接口
某科学的现代魔法 发表于6个月前
JAVA 服务器端下载接口
  • 发表于 6个月前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

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

 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();
			}
		}
	};

 

标签: java 下载
共有 人打赏支持
粉丝 0
博文 1
码字总数 373
×
某科学的现代魔法
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: