问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

客户要求上传文件要有断点续传的功能,现在公司用Struts2框架做上传,弱弱问一下Struts2能有断点续传功能吗

发布网友 发布时间:2022-04-21 02:53

我来回答

3个回答

热心网友 时间:2022-04-21 04:23

下载时,用的是HttpServletResponse,如果是用struts2时,可以用 implements 去实现 ServletResponseAware 接口;

然后声明定义一个:

private HttpServletResponse response;

private String fileName;

//这里省去了对 fileName 的get 和 set 方法

重写它的方法:

@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}

最后在Action里,定义一个方法去调用断点续传:

public String download(){

String mPath ="D:\\"

//mPath 也可以以读取配置文件的方式进行提取,这里就不再重复了。

String filePath =mPath+fileName;

downloadFileRanges(filePath);
return null;

}

/**

* 断点续传的方式进行下载
* @param filePath 带文件名的绝对路径
* @return
*/
private String downloadFileRanges(String filePath) {

System.out.println("下载时,收到传进来的值:" + filePath);
System.out.println(filePath);

File file = new File(filePath);
if (!file.exists()) {
// 文件不存在
return null;
} else {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);

this.response.setHeader("Accept-Ranges", "bytes");
long p = 0;
long l = 0;
// l = raf.length();
l = file.length();
// 如果是第一次下,还没有断点续传,状态是默认的 200,无需显式设置
// 响应的格式是:
// HTTP/1.1 200 OK
if (this.request.getHeader("Range") != null) // 客户端请求的下载的文件块的开始字节
{
// 如果是下载文件的范围而不是全部,向客户端声明支持并开始文件块下载
// 要设置状态
// 响应的格式是:
// HTTP/1.1 206 Partial Content
this.response
.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);// 206
// 从请求中得到开始的字节
// 请求的格式是:
// Range: bytes=[文件块的开始字节]-
p = Long.parseLong(this.request.getHeader("Range")
.replaceAll("bytes=", "").replaceAll("-", ""));
}
// 下载的文件(或块)长度
// 响应的格式是:
// Content-Length: [文件的总大小] - [客户端请求的下载的文件块的开始字节]
this.response.setHeader("Content-Length", new Long(l - p)
.toString());
if (p != 0) {
// 不是从最开始下载,
// 响应的格式是:
// Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
this.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
this.response.setContentType("application/octet-stream");
// 为客户端下载指定默认的下载文件名称
// 响应的格式是:
// Content-Disposition: attachment;filename="[文件名]"
// response.setHeader("Content-Disposition",
// "attachment;filename=\"" + s.substring(s.lastIndexOf("\\") +
// 1) +
// "\""); //经测试 RandomAccessFile 也可以实现,有兴趣可将注释去掉,并注释掉
// FileInputStream 版本的语句
this.response.setHeader("Content-Disposition",
"attachment;filename=" + file.getName() + "");
// raf.seek(p);
fis.skip(p);
byte[] b = new byte[1024];
int i;
// while ( (i = raf.read(b)) != -1 ) //经测试 RandomAccessFile
// 也可以实现,有兴趣可将注释去掉,并注释掉 FileInputStream 版本的语句
while ((i = fis.read(b)) != -1) {
this.response.getOutputStream().write(b, 0, i);
this.response.flushBuffer();
}
// raf.close();//经测试 RandomAccessFile 也可以实现,有兴趣可将注释去掉,并注释掉
// FileInputStream 版本的语句
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
this.response.getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}
return null;

}

最近在 Struts2.xml 里

<action name="download" class="com.test.DonwloadAction" method="download"></action>

在客户端调用:

download.action?fileName=test.mp3

这样就可以实现断点续传追问大哥这是下载 我要的是上传

追答断点上传struts2是做不到的,需要OCX插件。

热心网友 时间:2022-04-21 05:41

不能,得自己实现追问如何实现?有文档地址嘛?

追答断点续传是需要通过多线程实现的 百度有的是的

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
这种情况需要准备什么样的证据才能保证维权成功,关于个人知识产权方面... 侵犯著作权罪成立的条件是什么 网站被抄袭,怎么办?官网网页内容抄袭引发的法律问题 版权申请哪家性价比高? 著作权侵权损害如何赔偿 瓷砖划痕怎么处理方法 地板砖划痕怎么去除十种方法 关于梦幻西游转区的一些问题。懂的进。 茶叶泡水发苦的原因茶叶泡水发苦是什么原因 ...那又怎么样?从化学角度讲不也是那种分子起的作 火字旁的字十画的有那些?怎么读 如果将聊天记录迁移到另一个手机上就可以同步一个吗? 微信聊天记录能迁移到另一个吗 如何将一个的聊天记录转移到同一台手机的另外一个上面??_百度问一问 交通事故责任认定书不签字可以吗? 交通事故认定书不是本人签字生效吗 交通事故简易程序他人能代签吗 如何将一个上的聊天记录共享给另一个? 交通事故认定书未经本人同意别人代签,交警违反哪条交通法规 不同怎么迁移聊天记录? 聊天记录可以转到另一个上吗? 交通事故认定责任书 代签有什么责任 公司员工交通事故责任认定书可以由公司受权派人代签吗 交通事故责任认定书(简易程序)别人能代签不能 责任认定书可以代签吗? 交通事故责任认定朋友代签可以吗 交通事故责任认定书能不能代签 交通事故认定书可以代签吗 交通事故责任认定书可以代签吗 我用struts2做文件上传,传到服务器的始终是tmp临时文件,我想要真正的文件,请怎么解决 被人利用微信骗钱,只知道他的报警可以吗? 局域网,一台电脑共享文件夹,然后在这台电脑上新建用户,然后要经过什么设置,实现指定用户访问共享文件 如何搭建一个像百度云一样的局域网文件服务器 局域网 如何将局域网里,服务器里的一个盘作为自己电脑里的一个盘 电信的光猫可以不通过路由直接连电脑吗? struts2在上传文件时获得请求参数的问提 劳动合同没有一式两份生效吗 劳动合同没有一式两份 劳动合同没有一式两份合法吗 公司要求员工签劳动合同,但是合同只是公司拿着,员工手上没有,并没有一式两份。请问公司这样做合法吗? 劳动合同是否需要一式两份 劳动合同不是一式两份不具备法律 合同一式两份没有给我违法吗 劳动合同书是不是必须是一式两份 华为那个手机像素好内存大电池耐用 价格只要千多 侧面指纹解锁人脸识别? DNF为什么我的号上去后只有鼠标人控制?键盘就不能控制 玩其他的都可以 但是玩DNF就只要鼠标能控制 ? 战地之王在游戏中怎样用鼠标踢人 为什么魔兽世界旋转鼠标人物也会跟着动,我在镜头里已经调整了是永不调整镜头但还是这样,求解 最近玩lol,进入总是突然间鼠标键盘都不行了,就是点鼠标人不动,键盘也没反应,可以打字,但是别人看 我在学struts2,在用${}取值的时候老是不成功