1.调用文件上传信息接口,获取临时授权码,测试代码如下。
use AlibabaCloud\SDK\Dingtalk\Vdrive_1_0\Dingtalk;
# 需要注意的是这里的钉钉客户端在包 AlibabaCloud\SDK\Dingtalk\Vdrive_1_0
$client = new Dingtalk();
$getUploadInfoHeaders = new GetUploadInfoHeaders([]);
$getUploadInfoHeaders->xAcsDingtalkAccessToken = '<your accessToken>';
$getUploadInfoRequest = new GetUploadInfoRequest([
"unionId" => $unionId,
"fileName" => $fileName,
"fileSize" => $fileSize,
"md5" => md5($fileName),
"addConflictPolicy" => "autoRename"
]);
$res = $client->getUploadInfoWithOptions($spaceId, $parentId, $getUploadInfoRequest, $getUploadInfoHeaders, new RuntimeOptions([]));
return $res->body->stsUploadInfo;
返回参数如钉钉文档,得到这些参数以后调用 OSS STS (Security Token Service)接口授权文件上传
use OSS\OssClient;
use OSS\Core\OssException;
/**
* @param $securityToken '授权码'
* @param $accessKeyId '阿里云账号的临时accessKeyId'
* @param $accessKeySecret '阿里云账号的临时accessKeySecret'
* @param $endPoint 'OSS访问域名'
* @param $bucket 'OSS存储空间'
* @param $ossKey '对应OSS Object Key <mediaId>'
*/
public static function OSSUpload(
$securityToken,
$accessKeyId,
$accessKeySecret,
$endPoint,
$bucket,
$ossKey,
$filePath)
{
# 需要注意的是 这里的 $endPoint 一定要加 "https://"
$ossClient = new OssClient($accessKeyId, $accessKeySecret, "https://".$endPoint, false, $securityToken);
// 使用STS临时授权上传文件。
$ossClient->putObject($bucket, $ossKey, $filePath);
}
文件上传成功以后,使用第一个接口返回的 mediaId 调用添加钉钉文件的接口就可以在钉钉云盘看到文件并使用文件啦。
以下示例是官网直接copy的 具体文档地址为
https://open.dingtalk.com/document/isvapp-server/add-file
use AlibabaCloud\SDK\Dingtalk\Vdrive_1_0\Dingtalk;
$client = self::createClient();
$addFileHeaders = new AddFileHeaders([]);
$addFileHeaders->xAcsDingtalkAccessToken = "<your access token>";
$addFileRequest = new AddFileRequest([
"addConflictPolicy" => "autoRename",
"fileName" => "fileName",
"unionId" => "unionId",
"mediaId" => "mediaId",
"parentId" => "parentId",
"fileType" => "fileType"
]);
$client->addFileWithOptions("spaceId", $addFileRequest, $addFileHeaders, new RuntimeOptions([]));
}
需要注意的是,如果出现 accessToken不合法的问题,可能是因为PHP SDK处理字符串方法的问题,进入执行的方法,复制一个新的文件出来做出如下修改。
# 修改前
if (!Utils::isUnset($headers->xAcsDingtalkAccessToken)) {
@$realHeaders['x-acs-dingtalk-access-token'] = Utils::toJSONString($headers->xAcsDingtalkAccessToken);
}
# 修改后
if (!Utils::isUnset($headers->xAcsDingtalkAccessToken)) {
@$realHeaders['x-acs-dingtalk-access-token'] = $headers->xAcsDingtalkAccessToken;
}