如何使用C#将文件从ACC传输至Forge的OSS?
C#实现ACC文件直接转存至Forge OSS指南
前提准备
- 已申请Autodesk Forge应用,具备以下权限:
data:read(访问ACC文件)bucket:create、data:write(操作Forge OSS)
- 已获取用户的3-legged OAuth令牌(需关联目标ACC项目权限)
1. 获取ACC文件的临时下载链接
要实现无本地缓存转存,首先需通过ACC Data Management API获取文件的临时可下载URL,无需保存文件内容到本地磁盘。
核心逻辑
调用GET projects/{projectId}/items/{itemId}/download接口,可指定文件版本(不指定则默认最新版本),响应结果中包含临时下载链接。
C#代码示例
using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using Newtonsoft.Json; public async Task<string> GetAccFileDownloadUrl(string accessToken, string projectId, string itemId, string versionId = null) { using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var requestUrl = $"https://developer.api.autodesk.com/data/v1/projects/{projectId}/items/{itemId}/download"; if (!string.IsNullOrEmpty(versionId)) { requestUrl += $"?versionId={versionId}"; } var response = await client.GetAsync(requestUrl); response.EnsureSuccessStatusCode(); var downloadData = await response.Content.ReadAsStringAsync(); var downloadObj = JsonConvert.DeserializeObject<dynamic>(downloadData); return downloadObj.url; // 提取临时下载URL }
2. 直接转存至Forge OSS
拿到ACC文件的临时下载URL后,通过流式传输直接将文件内容上传到Forge OSS,全程不落地本地。
步骤说明
- 调用Forge OSS的
POST buckets/{bucketKey}/objects/{objectName}/signeds3upload接口,获取S3上传签名URL及请求头参数。 - 使用HttpClient从ACC临时URL拉取文件流,直接转发到S3签名URL完成上传。
C#代码示例
using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using Newtonsoft.Json; public async Task TransferAccFileToOss(string accessToken, string accDownloadUrl, string bucketKey, string objectName) { // 第一步:获取OSS上传签名 using var ossClient = new HttpClient(); ossClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var signPayload = new { objectName = objectName, minutesExpiration = 60 // 签名有效期,可按需调整 }; var signContent = new StringContent(JsonConvert.SerializeObject(signPayload), System.Text.Encoding.UTF8, "application/json"); var signResponse = await ossClient.PostAsync($"https://developer.api.autodesk.com/oss/v2/buckets/{bucketKey}/objects/{objectName}/signeds3upload", signContent); signResponse.EnsureSuccessStatusCode(); var signData = JsonConvert.DeserializeObject<dynamic>(await signResponse.Content.ReadAsStringAsync()); var ossUploadUrl = signData.url; var uploadHeaders = signData.headers.ToObject<Dictionary<string, string>>(); // 第二步:流式转发ACC文件到OSS using var transferClient = new HttpClient(); // 仅读取响应头,避免一次性加载大文件到内存 var accStreamResponse = await transferClient.GetAsync(accDownloadUrl, HttpCompletionOption.ResponseHeadersRead); accStreamResponse.EnsureSuccessStatusCode(); using var accStream = await accStreamResponse.Content.ReadAsStreamAsync(); var uploadRequest = new HttpRequestMessage(HttpMethod.Put, ossUploadUrl); // 添加OSS要求的请求头 foreach (var header in uploadHeaders) { uploadRequest.Headers.TryAddWithoutValidation(header.Key, header.Value); } uploadRequest.Content = new StreamContent(accStream); var uploadResponse = await transferClient.SendAsync(uploadRequest); uploadResponse.EnsureSuccessStatusCode(); }
注意事项
- 若文件大小超过5MB,建议使用Forge OSS的分片上传机制,将ACC文件流按固定大小拆分后逐个上传,避免内存占用过高。
- 注意ACC临时下载URL和OSS签名URL的有效期(默认均为60分钟),超时需重新获取。
- 需捕获HTTP异常(如401令牌失效、404资源不存在等),针对性处理重试或提示用户。
内容的提问来源于stack exchange,提问作者Mirco Bianchini
相关产品推荐
相关产品推荐

