单步上传
适用版本>=v7.0.2412b.20241226
接口说明:单步上传文件
请求说明
| 请求地址 | 配置域名+/openapi+/v7/filetransfer/file/upload |
|---|---|
| 请求方法 | POST |
| 签名方式 | KSO-1(配置域名+/openapi不参与签名) |
| 权限要求 | 文件摆渡(应用授权) kso.filetransfer.readwrite |
请求头(Header)
| 名称 | 参数类型 | 是否必填 | 说明 |
|---|---|---|---|
| Content-Type | string | 是 | 使用:application/octet-stream |
| X-Kso-Date | string | 是 | RFC1123 格式的日期,例: Wed, 23 Jan 2013 06:43:08 GMT |
| X-Kso-Authorization | string | 是 | KSO-1 签名值,详见《签名方法》 |
| Authorization | string | 是 | 授权凭证,格式为:Bearer {access_token} |
| ENCRYPT_SK | string | 否 | 非对称加密后的对称加密密钥,非对称加密算法见下方示例 |
查询参数(Query)
| 名称 | 参数类型 | 是否必填 | 说明 |
|---|---|---|---|
| task_id | string | 否 | 传输任务ID,当以文件夹为整体传输时,需要先新建传输任务 |
| box | string | 是 | outbox:发件箱 或 inbox:收件箱 |
| account_id | string | 是 | 三方用户ID |
| account_type | string | 是 | 可选值:third_user, 表示account_id为三方用户ID |
| outbox_company_id | string | 否 | 发件箱云文档租户ID, 当box=inbox时必传 |
| outbox_file_id | string | 否 | 发件箱文件ID, 当box=inbox时必传 |
| parent_id | string | 是 | 父目录文件ID |
| name | string | 是 | 文件名称,须包含文件后缀 |
| size | string | 是 | 文件大小, 单位字节 |
| file_type | string | 是 | 文件类型, 可选值:file、folder |
| transfer_id | string | 否 | 传输ID |
请求体(Body)
二进制文件流
响应体(Response)
| 名称 | 类型 | 说明 |
|---|---|---|
| data | object | |
| ∟ file_id | string | 文件id |
| ∟ is_finish | integer | 是否完成,0:未完成,1:已完成 |
| code | int | 错误码 |
| msg | string | 状态信息 |
| detail | string | 详细信息 |
响应体示例
json
{
"data": {
"file_id": "",
"is_finish": 0
},
"msg": "ok",
"code": 20000000
}非对称加密签名示例
go
// 非对称加密函数
func RsaEncryptBase64(originalData, publicKey string) (string, error) {
block, _ := pem.Decode([]byte(publicKey))
if block == nil {
return "", errors.ErrRsaPkDecodeFailed(zap.String("publicKey", publicKey))
}
pubKey, parseErr := x509.ParsePKIXPublicKey(block.Bytes)
if parseErr != nil {
return "", errors.ErrRsaPkParseFailed(zap.String("publicKey", publicKey))
}
// 获取密钥长度,计算最大加密块大小
keySize := pubKey.(*rsa.PublicKey).Size()
maxEncryptSize := keySize - 11
// 将原始数据按块大小分段加密
var encryptedData []byte
for len(originalData) > 0 {
segment := originalData
if len(segment) > maxEncryptSize {
segment = originalData[:maxEncryptSize]
}
encryptedSegment, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey.(*rsa.PublicKey), []byte(segment))
if err != nil {
return "", errors.ErrRsaEncryptFailed(zap.String("publicKey", publicKey))
}
encryptedData = append(encryptedData, encryptedSegment...)
originalData = originalData[len(segment):]
}
return base64.StdEncoding.EncodeToString(encryptedData), nil
}
// 调用示例
func encryptSk() (string, error) {
// 对称加密密钥
sk, err := encrypt.GenerateRandomString(32)
if err != nil {
return "", err
}
// 获取非对称加密公钥
pk, err := getPk()
if err != nil {
return "", err
}
// 加密sk
ssk, err := encrypt.RsaEncryptBase64(sk, pk)
if err != nil {
return "", err
}
return ssk, nil
}