包版本
springboot 2.7.5
hutool 5.5.7
tus-js-client 3.1.0
tus-js-client (我使用的是官网的示例代码)
var upload = new tus.Upload(file, {
endpoint: "http://localhost:10020/v2/group1/big/upload",
retryDelays: [0, 3000, 5000, 10000, 20000],
metadata: {
filename: file.name,
filetype: file.type
},
chunkSize: 1024 * 1024,
headers: {
'oe-token': getOeToken()
},
onError: function(error) {
console.log("Failed because: " + error)
},
onProgress: function(bytesUploaded, bytesTotal) {
var percentage = (bytesUploaded / bytesTotal * 100).toFixed(2)
console.log(bytesUploaded, bytesTotal, percentage + "%")
},
onSuccess: function() {
console.log("Download %s from %s", upload.file.name, upload.url)
//上传成功后的操作(我这边是获取上传后的文件信息)
}
})
// Check if there are any previous uploads to continue.
upload.findPreviousUploads().then(function (previousUploads) {
// Found previous uploads so we select the first one.
if (previousUploads.length) {
upload.resumeFromPreviousUpload(previousUploads[0])
}
// Start the upload
upload.start()
})
}
java代码
go-fastdfs文档地址:问题汇总 · GitBook (sjqzhang.github.io) (请自行安装)
image.png
private String goFastDfsUrl; // 你的go-fastdfs服务器地址
private String group;
private final String ACCESS_CONTROL_EXPOSE_HEADERS = "Upload-Offset, Location, Upload-Length, Tus-Version, Tus-Resumable, Tus-Max-Size, Tus-Extension, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Incomplete, Upload-Draft-Interop-Version";
@PostMapping(value = "/v2/group1/big/upload")
public void tusForwardV2(HttpServletRequest request, HttpServletResponse response) {
response.setStatus(HttpStatus.CREATED.value());
response.setHeader("Tus-Resumable", "1.0.0");
response.setHeader("Access-Control-Expose-Headers", ACCESS_CONTROL_EXPOSE_HEADERS);
HttpRequest post = HttpRequest.post(goFastDfsUrl + "/" + group + "/big/upload/");
post.header("Upload-Length", request.getHeader("Upload-Length"));
post.header("Upload-Metadata", request.getHeader("Upload-Metadata"));
post.header("Tus-Resumable", request.getHeader("Tus-Resumable"));
HttpResponse executed = post.execute();
if (executed.isOk()) {
response.setHeader("Tus-Resumable", executed.header("Tus-Resumable"));
String location = executed.header("Location");
if (StringUtils.isNotEmpty(location)) {
String secretKey = location.substring(location.lastIndexOf("/") + 1);
response.setHeader("Location", fileUrl + "/v2/group1/big/upload/" + secretKey);
}
}
}
@RequestMapping(value = "/v2/group1/big/upload/{secretKey}", method = RequestMethod.HEAD)
public void tusForward4HeadV2(HttpServletRequest request, HttpServletResponse response, @PathVariable String secretKey) {
response.setStatus(HttpStatus.OK.value());
response.setHeader("Tus-Resumable", "1.0.0");
response.setHeader("Access-Control-Expose-Headers", ACCESS_CONTROL_EXPOSE_HEADERS);
HttpRequest head = HttpRequest.head(goFastDfsUrl + "/" + group + "/big/upload/" + secretKey);
head.header("Tus-Resumable", "1.0.0");
HttpResponse executed = head.execute();
if (executed.isOk()) {
response.setHeader("Upload-Length", executed.header("Upload-Length"));
response.setHeader("Upload-Metadata", executed.header("Upload-Metadata"));
response.setHeader("Upload-Offset", executed.header("Upload-Offset"));
} else {
// 获取已上传的文件信息(因为已上传完成的文件不会返回成功,所以要在这里查询一次,查询到就是上传完成,查询不到就是上传失败)
GoFastDfsUploadStatus status = GoFastDfsUtils.fastGet(secretKey);
if (Objects.nonNull(status)) {
response.setHeader("Upload-Offset", status.getSize().toString());
response.setHeader("Upload-Length", status.getSize().toString());
}
}
}
@PatchMapping(value = "v2/group1/big/upload/{secretKey}")
public void tusForward4PatchV2(HttpServletRequest request, HttpServletResponse response, @PathVariable String secretKey) throws IOException {
response.setStatus(HttpStatus.NO_CONTENT.value());
response.setHeader("Tus-Resumable", "1.0.0");
response.setHeader("Access-Control-Expose-Headers", ACCESS_CONTROL_EXPOSE_HEADERS);
HttpRequest patch = HttpRequest.post(goFastDfsUrl + "/" + group + "/big/upload/" + secretKey);
patch.header("Content-Type", "application/offset+octet-stream");
// patch.header("Accept", "application/offset+octet-stream");
patch.header("X-HTTP-Method-Override", "PATCH");
patch.header("Tus-Resumable", "1.0.0");
patch.header("Upload-Offset", request.getHeader("Upload-Offset"));
patch.header("Content-Length", request.getHeader("Content-Length"));
patch.body(IoUtil.readBytes(request.getInputStream()));
HttpResponse executed = patch.execute();
if (executed.isOk()) {
response.setHeader("Upload-Offset", executed.header("Upload-Offset"));
}
}