update to v1.2.0 进一步完善了断点续传功能

This commit is contained in:
kohgylw 2024-01-11 21:32:18 +08:00
parent 04bc21ec6c
commit 6b81cf014e
5 changed files with 49 additions and 11 deletions

View File

@ -72,5 +72,5 @@ _提示源代码路径下包含了一些程序运行所需的非源代码资
### 联系作者?
如有任何需要(例如对该资源有疑问、意见或建议),请发件联系作者: kohgylw@163.com (青阳龙野),随时恭候您的来信!
青阳龙野@kohgylw by 2023年12月23
青阳龙野@kohgylw by 2024年01月11

View File

@ -1,4 +1,4 @@
kiftd项目 计划表-2023-12-29 by 青阳龙野
kiftd项目 计划表-2024-01-11 by 青阳龙野
已完成 v1.0.17
--------------
@ -216,3 +216,4 @@ test.auth.xxx=ucd
【已完成】修复了几处在执行文件导入导出操作时可能导致死锁的问题。
【已完成】新增“文件”功能的导入账户设置在账户配置文件中可通过“import.account=?”设置项来为“文件”功能中的导入操作指定“创建者”。
【已完成】进一步完善了移动文件时的提示信息:当用户不具备创建文件夹权限并移动文件夹时,会显示未授权提示。
【已完成】进一步完善了断点续传功能。

View File

@ -154,21 +154,57 @@ public class RangeFileStreamWriter {
final String ifRange = request.getHeader("If-Range");
if (rangeTag != null && rangeTag.startsWith("bytes=")
&& (ifRange == null || ifRange.trim().equals(eTag) || ifRange.trim().equals(lastModified))) {
status = HttpServletResponse.SC_PARTIAL_CONTENT;
response.setStatus(status);
// 进行断点续传
rangeBytes = rangeTag.replaceAll("bytes=", "");
if (rangeBytes.indexOf("-") < 0) {
// 数据范围请求格式不正确应为?-?的格式
status = HttpServletResponse.SC_BAD_REQUEST;
response.setStatus(status);
return status;
}
if (rangeBytes.endsWith("-")) {
// 解析请求参数范围为仅有起始偏移量而无结束偏移量的情况
startOffset = Long.parseLong(rangeBytes.substring(0, rangeBytes.indexOf('-')).trim());
try {
startOffset = Long.parseLong(rangeBytes.substring(0, rangeBytes.indexOf('-')).trim());
} catch (NumberFormatException e) {
// 数据范围请求不正确
status = HttpServletResponse.SC_BAD_REQUEST;
response.setStatus(status);
return status;
}
// 仅具备起始偏移量时例如文件长为13请求为5-则响应体长度为8
contentLength = fileLength - startOffset;
} else {
hasEnd = true;
startOffset = Long.parseLong(rangeBytes.substring(0, rangeBytes.indexOf('-')).trim());
endOffset = Long.parseLong(rangeBytes.substring(rangeBytes.indexOf('-') + 1).trim());
// 具备起始偏移量与结束偏移量时例如0-9则响应体长度为10个字节
try {
if (rangeBytes.startsWith("-")) {
// 解析请求参数范围为仅有结束偏移量而无起始偏移量的情况例如-3
startOffset = fileLength
- Long.parseLong(rangeBytes.substring(rangeBytes.indexOf('-') + 1).trim());
endOffset = fileLength - 1;
} else {
// 解析请求参数范围既有起始偏移量又有结束偏移量的情况例如0-9
startOffset = Long.parseLong(rangeBytes.substring(0, rangeBytes.indexOf('-')).trim());
endOffset = Long.parseLong(rangeBytes.substring(rangeBytes.indexOf('-') + 1).trim());
}
} catch (NumberFormatException e) {
// 数据范围请求不正确
status = HttpServletResponse.SC_BAD_REQUEST;
response.setStatus(status);
return status;
}
// 具备结束偏移量时例如文件长为10请求为0-9或-10则响应体长度为10
contentLength = endOffset - startOffset + 1;
}
if (contentLength > fileLength || contentLength <= 0) {
// 数据范围请求不正确
status = HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE;
response.setStatus(status);
return status;
}
// 设置响应状态为206
status = HttpServletResponse.SC_PARTIAL_CONTENT;
response.setStatus(status);
// 设置Content-Range格式为bytes 起始偏移-结束偏移/文件的总大小
String contentRange;
if (!hasEnd) {
@ -179,8 +215,9 @@ public class RangeFileStreamWriter {
.toString();
}
response.setHeader("Content-Range", contentRange);
} else { // 从开始进行下载
contentLength = fileLength; // 客户端要求全文下载
} else {
// 不进行断点续传
contentLength = fileLength;
}
if (sendBody) {
response.setHeader("Content-Length", "" + contentLength);// 设置请求体长度

View File

@ -1,5 +1,5 @@
#Generated by Maven Integration for Eclipse
#Mon Jan 08 23:10:33 CST 2024
#Thu Jan 11 21:24:52 CST 2024
m2e.projectLocation=/Users/kohgylw/Programs/java_workspace/kiftd
m2e.projectName=kiftd
groupId=kohgylw