初始化文件分片上传
POST
/v1.0/storage/spaces/{spaceId}/files/multiPartUploadInfos/init
接口调用步骤
import com.aliyun.dingtalkstorage_1_0.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.util.AccessTokenUtil;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.Map;
public class MultipartUpload {
public static com.aliyun.dingtalkstorage_1_0.Client createClient() throws Exception {
Config config = new Config();
config.protocol = "https";
config.regionId = "central";
return new com.aliyun.dingtalkstorage_1_0.Client(config);
}
@Test
public void test() throws Exception {
com.aliyun.dingtalkstorage_1_0.Client client = MultipartUpload.createClient();
String spaceId = "存储空间ID";
String filePath = "/Users/xxxxx/Desktop/音乐.mp3";
// 每片文件大小
long partSize = 1 * 1024 * 1024L; // 1MB
// 初始化分片上传接口
InitMultipartFileUploadHeaders initMultipartFileUploadHeaders = new InitMultipartFileUploadHeaders();
initMultipartFileUploadHeaders.xAcsDingtalkAccessToken = "accessToken";
InitMultipartFileUploadRequest initMultipartFileUploadRequest = new InitMultipartFileUploadRequest();
initMultipartFileUploadRequest.setUnionId(unionId);
InitMultipartFileUploadRequest.InitMultipartFileUploadRequestOption initMultipartFileUploadRequestOption = new InitMultipartFileUploadRequest.InitMultipartFileUploadRequestOption();
initMultipartFileUploadRequestOption.setStorageDriver("DINGTALK");
initMultipartFileUploadRequest.setOption(initMultipartFileUploadRequestOption);
String uploadKey = client.initMultipartFileUploadWithOptions(spaceId, initMultipartFileUploadRequest, initMultipartFileUploadHeaders, new RuntimeOptions()).getBody().getUploadKey();
File file = new File(filePath);
long fileLength = file.length();
int partCount = (int) (fileLength / partSize) + ((fileLength % partSize != 0) ? 1 : 0);
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
// 获取分片上传信息
GetMultipartFileUploadInfosHeaders getMultipartFileUploadInfosHeaders = new GetMultipartFileUploadInfosHeaders();
getMultipartFileUploadInfosHeaders.xAcsDingtalkAccessToken = "accessToken";
GetMultipartFileUploadInfosRequest getMultipartFileUploadInfosRequest = new GetMultipartFileUploadInfosRequest();
getMultipartFileUploadInfosRequest.setUnionId(unionId);
getMultipartFileUploadInfosRequest.setUploadKey("第一步初始化分片上传接口获取的uploadKey");
getMultipartFileUploadInfosRequest.setPartNumbers(Arrays.asList(i + 1));
GetMultipartFileUploadInfosResponseBody.GetMultipartFileUploadInfosResponseBodyMultipartHeaderSignatureInfosHeaderSignatureInfo headerSignatureInfo = client.getMultipartFileUploadInfosWithOptions(getMultipartFileUploadInfosRequest, getMultipartFileUploadInfosHeaders, new RuntimeOptions()).body.multipartHeaderSignatureInfos.get(0).headerSignatureInfo;
uploadPartFile(startPos, curPartSize, headerSignatureInfo, file);
}
// 提交文件,完成上传
CommitFileHeaders commitFileHeaders = new CommitFileHeaders();
commitFileHeaders.xAcsDingtalkAccessToken = "accessToken";
CommitFileRequest.CommitFileRequestOption commitFileRequestOption
= new CommitFileRequest.CommitFileRequestOption()
.setSize(1024L)
.setConflictStrategy("OVERWRITE");
CommitFileRequest commitFileRequest = new CommitFileRequest()
.setUnionId(unionId)
.setUploadKey(“第一步初始化分片上传接口获取的uploadKey”)
.setName("音乐.mp3")
.setParentId("0")
.setOption(commitFileRequestOption);
CommitFileResponseBody.CommitFileResponseBodyDentry dentry = client.commitFileWithOptions("存储空间ID", commitFileRequest, commitFileHeaders, new RuntimeOptions()).body.dentry;
System.out.println(dentry);
}
private void uploadPartFile(long start, long size, GetMultipartFileUploadInfosResponseBody.GetMultipartFileUploadInfosResponseBodyMultipartHeaderSignatureInfosHeaderSignatureInfo headerSignatureInfo, File file) throws Exception {
InputStream inputStream = new FileInputStream(file);
if (start > 0) {
inputStream.skip(start);
}
URL url = new URL(headerSignatureInfo.getResourceUrls().get(0));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("PUT");
connection.setUseCaches(false);
if (headerSignatureInfo.getHeaders() != null) {
for (Map.Entry<String, String> entry : headerSignatureInfo.getHeaders().entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
}
connection.setReadTimeout(10000);
connection.setConnectTimeout(10000);
connection.connect();
OutputStream out = connection.getOutputStream();
byte[] buffer = new byte[1024];
long remain = size;
for (;remain > 0;) {
int sizeToRead = remain < buffer.length ? (int)remain : buffer.length;
int rsz = inputStream.read(buffer, 0, sizeToRead);
if (rsz < 0) {
break;
}
out.write(buffer, 0, rsz);
remain -= rsz;
}
out.flush();
out.close();
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
System.out.println("上传成功");
} else {
System.out.println("上传失败");
}
connection.disconnect();
}
}
权限
应用类型 | 是否支持 | 权限 | API Explorer调试 |
---|---|---|---|
企业内部应用 | 支持 | 企业存储文件上传信息读权限 | API Explorer |
第三方企业应用 | 支持 | 企业存储文件上传信息读权限 | API Explorer |
第三方个人应用 | 暂不支持 | 企业存储文件上传信息读权限 | 暂不支持 |
错误码
HttpCode | 错误码 | 错误信息 | 说明 |
---|---|---|---|
400 | paramError | %s | 参数错误 |
400 | paramError.multipart | %s | 参数错误-multipart |
400 | paramError.protocol | %s | 参数错误-protocol |
400 | paramError.spaceId | %s | 参数错误-spaceId |
400 | paramError.storageDriver | %s | 参数错误-storageDriver |
400 | spaceQuotaInsufficient | %s | 空间容量不足 |
400 | sceneQuotaInsufficient | %s | 场景容量不足 |
400 | appQuotaInsufficient | %s | 应用容量不足 |
400 | orgQuotaInsufficient | %s | 企业容量不足 |
400 | dentryUploadForbidden | %s | 禁止上传 |
400 | dentryUploadProtocolNotSupport | %s | 不支持的上传协议 |
403 | permissionDenied | %s | 用户缺少上传文件的权限 |
404 | spaceNotExist | %s | 空间不存在 |
500 | systemError | %s | 系统错误 |
500 | unknownError | Unknown Error | 未知错误 |
503 | operationTimeout | %s | 请求超时 |
请求示例请求示例
Shell
JavaScript
Java
Swift
curl --location --request POST 'https://api.dingtalk.com/v1.0/storage/spaces//files/multiPartUploadInfos/init?unionId=String' \
--header 'x-acs-dingtalk-access-token;' \
--header 'Content-Type: application/json' \
--data-raw '{
"option" : {
"storageDriver" : "String",
"preCheckParam" : {
"md5" : "String",
"size" : Long,
"parentId" : "String",
"name" : "String"
},
"preferRegion" : "String"
}
}'
响应示例响应示例
{
"uploadKey": "string",
"storageDriver": "string"
}
请求参数
Path 参数
spaceId
string
必需
Query 参数
unionId
string
必需
示例值:
String
Header 参数
x-acs-dingtalk-access-token
string
必需
Body 参数application/json
返回响应
修改于 2024-01-16 02:37:02