如何在Activity/WorkItem中通过签名S3上传端点上传Zip文件?
问题解答
首先明确:无法仅通过WorkItem/Activity的XrefTreeArgument定义完成新的签名式S3上传流程。原因是XrefTreeArgument仅支持单个独立的HTTP请求操作,无法处理需要依赖前一步返回结果的多步串联请求(比如先获取签名URL,再上传文件,最后提交确认这三步,后两步需要用到第一步返回的签名参数)。
可行的替代方案
方案1:在AppBundle插件代码中实现多步上传逻辑
这是最直接的适配方式,你可以在插件代码里完成完整的三步上传流程:
- 向
/oss/v2/buckets/{bucketKey}/objects/{filename}/signeds3upload发送GET请求,获取上传签名、S3地址等参数 - 使用拿到的S3预签名URL,将生成的Zip文件通过PUT请求上传到S3
- 再次调用上述端点发送POST请求,携带上传密钥完成上传确认
示例代码逻辑(C#):
// 第一步:获取上传签名 var getSignRequest = new HttpRequestMessage(HttpMethod.Get, $"https://developer.api.autodesk.com/oss/v2/buckets/{bucketKey}/objects/{outputName}/signeds3upload"); getSignRequest.Headers.Add("Authorization", $"Bearer {token}"); var getSignResponse = await httpClient.SendAsync(getSignRequest); var signData = await getSignResponse.Content.ReadFromJsonAsync<SignUploadResponse>(); // 需定义对应实体类 // 第二步:上传文件到S3 var uploadRequest = new HttpRequestMessage(HttpMethod.Put, signData.UploadUrl); uploadRequest.Content = new StreamContent(File.OpenRead(outputName)); uploadRequest.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip"); await httpClient.SendAsync(uploadRequest); // 第三步:确认上传完成 var confirmRequest = new HttpRequestMessage(HttpMethod.Post, $"https://developer.api.autodesk.com/oss/v2/buckets/{bucketKey}/objects/{outputName}/signeds3upload"); confirmRequest.Headers.Add("Authorization", $"Bearer {token}"); confirmRequest.Content = new StringContent(JsonSerializer.Serialize(new { uploadKey = signData.UploadKey }), Encoding.UTF8, "application/json"); await httpClient.SendAsync(confirmRequest);
方案2:客户端接收WorkItem输出后完成上传
如果不想修改AppBundle代码,可以将WorkItem的输出Zip文件先下载到客户端,再在客户端执行上述三步上传流程。这种方式不需要改动插件代码,但需要客户端额外处理文件下载和上传逻辑。
补充说明
Design Automation的XrefTreeArgument设计初衷是处理简单的单步文件传输(比如直接下载输入文件、上传输出文件到指定HTTP端点),不支持复杂的多步依赖式HTTP交互。因此新的签名上传流程无法通过原有的XrefTreeArgument配置实现,必须通过代码层面的逻辑来完成。
内容的提问来源于stack exchange,提问作者Mark Brouwers
相关产品推荐
相关产品推荐

