package com.archermind.util;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FileDownloader {
public String download(String filePath, HttpServletResponse response,
HttpServletRequest request) {
try {
// 你可以使用你服务器上的文件及其路径
// RandomAccessFile 方式
java.io.RandomAccessFile raf = new java.io.RandomAccessFile(
filePath, "r");
response.reset();
response.setHeader("Server", "ad@Interdrp.com");
// 告诉客户端允许断点续传多线程连接下载
response.setHeader("Accept-Ranges", "bytes");
long p = 0;
long l = 0;
l = raf.length(); // RandomAccessFile 方式
// 如果是第一次下,还没有断点续传,状态是默认的 200,无需显式设置
if (request.getHeader("Range") != null) // 客户端请求的下载的文件块的开始字节
{
// 如果是下载文件的范围而不是全部,向客户端声明支持并开始文件块下载
// 要设置状态
// 响应的格式是:
// HTTP/1.1 206 Partial Content
response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);// 206
// 从请求中得到开始的字节
// 请求的格式是:
// Range: bytes=[文件块的开始字节]-
p = Long.parseLong(request.getHeader("Range")
.replaceAll("bytes=", "").replaceAll("-", ""));
}
// 下载的文件(或块)长度
// 响应的格式是:
// Content-Length: [文件的总大小] - [客户端请求的下载的文件块的开始字节]
response.setHeader("Content-Length", new Long(l - p).toString());
if (p != 0) {
// 不是从最开始下载,
// 响应的格式是:
// Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
response.setHeader("Content-Range",
"bytes " + new Long(p).toString() + "-"
+ new Long(l - 1).toString() + "/"
+ new Long(l).toString());
}
// response.setHeader("Connection", "Close"); //如果有此句话不能用 IE 直接下载
// 使客户端直接下载,
// 响应的格式是:
// Content-Type: application/octet-stream
response.setContentType("application/octet-stream");
// 为客户端下载指定默认的下载文件名称
// 响应的格式是:
// Content-Disposition: attachment;filename="[文件名]"
response.setHeader("Content-Disposition", "attachment;filename=\""
+ filePath.substring(filePath.lastIndexOf("\\") + 1) + "\""); // RandomAccessFile
raf.seek(p);
// fis.skip(p);
byte[] b = new byte[1024];
int i;
while ((i = raf.read(b)) != -1) // RandomAccessFile 方式
{
response.getOutputStream().write(b, 0, i);
}
raf.close();
} catch (IOException e) {
e.printStackTrace();
return "error to download file";
}
return null;
}
}
红色部分代码循环抛异常了(手机uc浏览器8.3)
请帮我分析下错误原因
谢谢
ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
at com.archermind.util.FileDownloader.download(FileDownloader.java:85)
at com.archermind.action.FileDownloadAction.frontDownload(FileDownloadAction.java:290)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
at
分享到:
相关推荐
本资料包“基于C#的WebAPI断点续传几种方式及WebClient断点续传下载.zip”主要探讨了两种在C#环境下实现断点续传的方法:一是通过WebAPI实现服务端的断点续传功能,二是使用WebClient类进行客户端的断点续传下载。...
断点续传下载是一种网络下载方式,它允许下载过程中丢失连接或停止后,重新连接时从上次下载断点的地方继续下载文件,从而节省时间和网络流量。这种方式特别适合下载大型文件或经常更新的文件,如电影、音乐、软件、...
在Android开发中,多线程断点续传下载是一项重要的技术,它允许用户在网络连接不稳定或者设备突然断电的情况下,能够从上次中断的地方继续下载,提高了用户体验。本项目提供的"MultiThreadDownload"是一个实现这一...
- 网络不稳定可能导致断点续传失败,需要有重试机制来处理异常情况。 通过这个实例,开发者可以了解并实践FastDFS的断点续传功能,从而更好地在实际项目中应用这一特性。同时,这也是一个学习FastDFS和分布式文件...
在IT领域,多线程下载和断点续传是提高下载效率和用户体验的重要技术。这里,我们将深入探讨这两个概念,并结合使用HttpURLConnection实现的多线程下载工具进行讲解。 首先,多线程下载是一种利用网络资源的方式,...
本"oss下载(断点续传,后台显示进度)源代码.rar"压缩包包含了一个实现阿里云OSS断点续传下载并带有进度条展示的示例代码。通过分析和学习这个代码,我们可以掌握以下几个关键知识点: 1. **阿里云OSS SDK**:首先...
在IT领域,大文件下载和断点续传是网络编程中的重要组成部分,特别是在客户端-服务器交互的应用中。本文将深入探讨使用C#语言实现大文件下载的断点续传技术,以及如何扩展功能,如多线程下载和任务导入导出。 首先...
断点续传是一种非常实用的技术,尤其在处理大文件下载时,允许用户中断并重新启动下载,而无需从头开始。 首先,我们需要了解HTTP协议的基本概念。HTTP(超文本传输协议)是用于在Web上传输数据的标准协议。在下载...
在iOS开发中,断点续传下载是一种常见的网络下载技术,尤其在处理大文件时,它允许用户在中断网络连接后从上次停止的地方继续下载,而不是重新开始。本示例项目"ios 断点续传下载例子"是基于ASIHTTPRequest库实现的...
在Unity游戏开发中,断点续传是一种非常实用的技术,特别是在处理大文件下载时,能够提高用户体验并降低服务器压力。断点续传允许用户在中断网络连接后从上次停止的地方继续下载,而不是重新开始。本示例将详细介绍...
在C/C++编程中,实现线程断点续传是一项技术挑战,特别是在处理大文件下载时,这种功能显得尤为重要。断点续传允许程序在中断后从上次停止的地方继续下载,提高了用户体验并节省了网络资源。Cocos2dx是一个基于C++的...
python多线程,断点续传下载程序,功能比较简单,可以进行二次开发。实现更好用的 功能。
断点续传技术是现代网络下载中非常关键的一项功能,尤其在大文件传输时更为重要。这个技术允许用户中断下载后,在同一位置继续下载,而无需重新开始,从而节省了大量的时间和带宽资源。在安卓系统中,实现断点续传...
断点续传下载技术是网络数据传输中一种重要的优化手段,尤其在大文件下载场景下,它极大地提高了用户下载效率并降低了网络资源的浪费。这一技术的原理是允许下载过程在中断后从上次中断的位置继续,而不是从头开始。...
断点续传下载技术是网络下载领域中一种重要的优化手段,尤其在大文件下载时,它极大地提高了用户体验和效率。这种技术允许用户在中断下载后,从上次停止的地方继续下载,而无需重新开始整个过程。这通常是通过在...
VC FTP、HTTP 多线程断点续传下载文件,在断点下载时,可获取远程站点信息,如:是否支持断点续传、要下载的文件大小和创建时间等。可设置下载的线程数、下载任务的线程函数、多线程断点续传下载一个文件、关于BOOL ...
在iOS开发中,实现文件的下载,特别是大文件的下载,断点续传是一个非常重要的功能。这个项目“DownAndASIRequest”就是基于ASIHttpRequest库实现的一个简单示例,它展示了如何在iOS应用中实现这一功能。下面我们将...
在IT领域,断点续传是一项非常实用的技术,特别是在大文件下载过程中,它允许用户中断下载后从停止的地方继续,而无需重新开始。本项目"**C# 断点续传下载文件**"就是实现这一功能的一个实例,适用于Visual Studio ...
局域网断点续传工具是一种专为解决在局域网环境下进行大文件传输时遇到的问题而设计的应用软件。在不稳定的网络环境中,比如无线局域网,由于信号波动、网络中断等因素,大文件的复制过程可能会频繁中断,导致用户...
在IT行业中,断点续传是一项非常实用的技术,特别是在大文件传输时,它允许用户中断传输后从上次中断的位置继续,极大地提高了效率和用户体验。FastDFS是一个轻量级的分布式文件系统,它专为互联网设计,能有效地...