Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

新增云空间分片上传素材组合函数 #2

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions src/main/java/com/larksuite/oapi/composite_api/drive/Drive.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.lark.oapi.Client;
import com.lark.oapi.service.drive.v1.enums.FileUploadInfoParentTypeEnum;
import com.lark.oapi.service.drive.v1.enums.MediaUploadInfoParentTypeEnum;
import com.lark.oapi.service.drive.v1.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -18,6 +19,81 @@ public class Drive {

private static final Logger log = LoggerFactory.getLogger(Drive.class);

/**
* 分片上传大文件至云空间文件夹下,使用到三个OpenAPI:
* 1. [分片上传文件(预上传)](<a href="https://open.feishu.cn/document/server-docs/docs/drive-v1/media/multipart-upload-media/upload_prepare">...</a>)
* 2. [分片上传文件(上传分片)](<a href="https://open.feishu.cn/document/server-docs/docs/drive-v1/media/multipart-upload-media/upload_part">...</a>)
* 2. [分片上传文件(完成上传)](<a href="https://open.feishu.cn/document/server-docs/docs/drive-v1/media/multipart-upload-media/upload_finish">...</a>)
*/
public static UploadFinishMediaResp uploadMediaByPart(Client client, String parentNode, File file, MediaUploadInfoParentTypeEnum type) throws Exception {
// 预上传, 获取文件分片大小与分片数量
UploadPrepareMediaResp prepareResp = client.drive()
.media()
.uploadPrepare(
UploadPrepareMediaReq.newBuilder()
.mediaUploadInfo(
MediaUploadInfo.newBuilder()
.fileName(file.getName())
.size(toInt(file.length()))
.parentNode(parentNode)
.parentType(type)
.build()
)
.build()
);

UploadPrepareMediaRespBody prepareRespData = prepareResp.getData();
log.info("[upload-prepare-resp] upload-id={}, block-size:{}, block-num: {}",
prepareRespData.getUploadId(),
prepareRespData.getBlockSize(),
prepareRespData.getBlockNum()
);

// 拆分文件分片, 逐片上传
Map<Integer, File> sliceFileMap = sliceFile(file, prepareRespData.getBlockSize(), prepareRespData.getBlockNum());
for (int i = 0; i < prepareRespData.getBlockNum(); i++) {
File sliceFile = sliceFileMap.get(i);
UploadPartMediaResp resp = client.drive()
.media()
.uploadPart(
UploadPartMediaReq.newBuilder()
.uploadPartMediaReqBody(
UploadPartMediaReqBody.newBuilder()
.uploadId(prepareRespData.getUploadId())
.size(toInt(sliceFile.length()))
.seq(i)
.checksum(calculateAdler32(sliceFile))
.file(sliceFile)
.build()
)
.build()
);

log.info("[upload-part-resp] index={}, success={}, msg={}", i, resp.success(), resp.getMsg());
}

// 清理碎片文件
sliceFileMap.values().forEach(Drive::del);

// 完成上传
UploadFinishMediaResp finishResp = client.drive()
.media()
.uploadFinish(
UploadFinishMediaReq.newBuilder()
.uploadFinishMediaReqBody(
UploadFinishMediaReqBody.newBuilder()
.uploadId(prepareRespData.getUploadId())
.blockNum(prepareRespData.getBlockNum())
.build()
)
.build()
);

log.info("[upload-finish-resp] success={}, msg={}, fileToken={}",
finishResp.success(), finishResp.getMsg(), finishResp.getData().getFileToken());
return finishResp;
}

/**
* 分片上传大文件至云空间文件夹下,使用到三个OpenAPI:
* 1. [分片上传文件(预上传)](<a href="https://open.feishu.cn/document/server-docs/docs/drive-v1/upload/multipart-upload-file-/upload_prepare">...</a>)
Expand Down