js-tus-client + springboot + go-fastdfs文件服务器 转发tus请求到go-fastdfs服务器

包版本

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"));
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容