js-tus-client + springboot + go-fastdfs文件服務(wù)器 轉(zhuǎn)發(fā)tus請求到go-fastdfs服務(wù)器

包版本

springboot 2.7.5
hutool 5.5.7
tus-js-client 3.1.0

tus-js-client (我使用的是官網(wǎng)的示例代碼)

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服務(wù)器地址
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 {
        // 獲取已上傳的文件信息(因?yàn)橐焉蟼魍瓿傻奈募粫祷爻晒Γ砸谶@里查詢一次,查詢到就是上傳完成,查詢不到就是上傳失?。?        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"));
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容