You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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,全程不落地本地。

步骤说明

  1. 调用Forge OSS的POST buckets/{bucketKey}/objects/{objectName}/signeds3upload接口,获取S3上传签名URL及请求头参数。
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:42:43