【问题标题】:How to upload file to storage location in Autodesk Forge using 3-legged Token?如何使用 3-legged Token 将文件上传到 Autodesk Forge 中的存储位置?
【发布时间】:2017-05-26 11:44:21
【问题描述】:

我已经通过 3-legged Token、bucketKeyobjectName 通过创建存储位置 API 生成了 accessToken,如 this tutorial(step 4) 所示。

我想将文件上传到存储位置。我的请求返回“OK 200”状态,但它没有按照我的需要将文件上传到 A360。 错误在哪里?如何使用 3-legged Token 正确上传文件到用户的存储位置?

    [HttpGet]
    public JObject UploadFile(string accessToken,string bucketKey,string objectName,string filePath)
    {                      
        var url = String.Format("https://developer.api.autodesk.com/oss/v2/buckets/{0}/objects/{1}", bucketKey, objectName);

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            var response = client.PutAsync(url, new StreamContent(System.IO.File.OpenRead(filePath))).Result.EnsureSuccessStatusCode();
            System.Diagnostics.Debug.WriteLine(response);
        }

    }

请求必须返回带有创建文件参数的JSON,但返回:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Access-Control-Allow-Credentials: true
  Access-Control-Allow-Headers: Authorization, Accept-Encoding, Range, Content-Type
  Access-Control-Allow-Methods: GET
  Access-Control-Allow-Origin: *
  Connection: keep-alive
  Date: Wed, 11 Jan 2017 15:36:21 GMT
  Server: Apigee
  Server: Router
  Content-Length: 440
  Content-Type: application/json; charset=utf-8
}

【问题讨论】:

    标签: c# autodesk autodesk-forge autodesk-data-management


    【解决方案1】:

    我已经按照该教程中的步骤将文件上传到我的 a360 集线器没有问题,您是否尝试过仅通过 Rest 调用或 cURL 调用来确保过程正确?我可以告诉你我使用 cURL 的步骤,这样你就可以尝试并告诉我。

    注意:使用 cURL 时,我使用 JQ 处理器以更有条理的方式可视化终端中的响应。 https://stedolan.github.io/jq/

    三足身份验证

    步骤 0.1:将用户引导至授权 Web 流程,设置正确的范围

    https://developer.api.autodesk.com/authentication/v1/authorize?response_type=code&client_id=xxxxxxxxxx&redirect_uri=http%3A%2F%2Fxxxxx.com%2Foauth%2Fcallback&scope=data:read数据:写桶:创建桶:读数据:创建

    步骤 0.2:实现提取授权码的代码

    代码 = xxxxxxxxxxxxx-xxxxx-xxxxxxxxx

    步骤 0.3:将授权码交换为访问令牌

    curl -v 'https://developer.api.autodesk.com/authentication/v1/gettoken' -X 'POST' -H 'Content-Type: application/x-www-form-urlencoded' -d 'client_id=xxxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxx&grant_type=authorization_code&code=xxxxxxxxx-xxxxxxx&redirect_uri=http://xxxxxx.com/oauth/callback' | jq '.'
    

    回应

    { "access_token": "OC5yVHwVyjZRfxQhXJxxxxxxxxx", "refresh_token": "o3pKZaUvEsIozWwdyldoHGmLjxxxxxxxxxxx", "token_type": "承载者", “expires_in”:86399 }

    现在我们有了 3 条腿令牌,让我们开始将文件上传到 A360 Hub 的步骤

    第 1 步:找到拥有您的资源的中心

    curl -X GET -H "Authorization: Bearer xxxxxxxxxxxxxx" "https://developer.api.autodesk.com/project/v1/hubs" | jq '.'
    

    响应将是:

    { “jsonapi”:{ “版本”:“1.0”},“链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/project/v1/hubs" } }, “数据”: [ { “类型”:“集线器”, "id": "a.cGVyc29uYWw6dWxxxxxxxxxxx", // 记下这个 ID “属性”: { “名称”:“欧特克”, “延期”: { “类型”:“集线器:autodesk.core:集线器”, “版本”:“1.0”, “模式”:{ "href": "https://developer.api.autodesk.com/schema/v1/versions/hubs%3Aautodesk.core%3AHub-1.0" }, “数据”: {} } }, “链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/project/v1/hubs/a.YnVzaW5lc3M6YXV0xxxxxxxxxx" } }, “关系”:{ “项目”:{ “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/project/v1/hubs/a.YnVzaW5lc3M6YXV0b2Rlc2sxNDU/projects" } } } } }

    第 2 步:找到拥有您的资源的项目

    curl -X GET -H "Authorization: Bearer OC5yVHwVyxxxxxxxxxxxx" "https://developer.api.autodesk.com/project/v1/hubs/a.cGVyc29uYWw6dWxxxxxxxxxxx/projects" | jq '.'
    

    回应

    { “jsonapi”:{ “版本”:“1.0”},“链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/project/v1/hubs/a.cGVyc29uYWw6dWxxxxxxxxxxx/projects" } }, “数据”: [ { “类型”:“项目”, "id": "a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ", “属性”: { "name": "要共享的设计文件", “延期”: { “类型”:“项目:autodesk.core:项目”, “版本”:“1.0”, “模式”:{ "href": "https://developer.api.autodesk.com/schema/v1/versions/projects%3Aautodesk.core%3AProject-1.0" }, “数据”: {} } }, “链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/project/v1/hubs/a.cGVyc29uYWw6dWxxxxxxxxxxx/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ" } }, “关系”:{ “中心”: { “数据”: { “类型”:“集线器”, “id”:“a.cGVyc29uYWw6dWxxxxxxxxxxx” }, “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/project/v1/hubs/a.cGVyc29uYWw6dWxxxxxxxxxxx" } } }, “根文件夹”: { “数据”: { “类型”:“文件夹”, "id": "urn:adsk.wipprod:fs.folder:co.BKklEuaHRsiii-mKNxxxxxx" }, “元”:{ “关联”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/folders/urn%3Aadsk.wipprod%3Afs.folder%3Aco.BKklEuaHRsiii-mKNxxxxxx" } } }, “顶级文件夹”:{ “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/project/v1/hubs/a.cGVyc29uYWw6dWxxxxxxxxxxx/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/topFolders" } } } } }

    //第三步:创建存储位置

    curl -X POST -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -H "Authorization: Bearer OC5yVHwVyjZRfxxxxxxxxx" -d '{
          "jsonapi": { "version": "1.0" },
          "data": {
            "type": "objects",
            "attributes": {
              "name": "lego-racecar.3dm"
            },
            "relationships": {
              "target": {
                "data": { "type": "folders", "id": "urn:adsk.wipprod:fs.folder:co.BKklEuaHRsiii-mKNxxxxxx" }
              }
            }
          }
    }' "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/storage" | jq '.'
    

    调用的响应

    { “jsonapi”:{ “版本”:“1.0”},“数据”:{ “类型”:“对象”, "id": "urn:adsk.objects:os.object:wip.dm.prod/6d106e5b-2ac6-41d5-aa1c-b08694xxxxxx.3dm", “关系”:{ “目标”: { “数据”: { “类型”:“文件夹”, "id": "urn:adsk.wipprod:fs.folder:co.BKklEuaHRsiii-mKNxxxxxx" }, “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/folders/urn%3Aadsk.wipprod%3Afs.folder%3Aco.BKklEuaHRsiii-mKNxxxxxx" } } } } } }

    第 4 步:将文件上传到存储位置

    curl -X PUT -H "Authorization: Bearer OC5yVHwVyjZRfxQhXJjxxxxxxx" --data-binary @lego-racecar.3dm "https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/6d106e5b-2ac6-41d5-aa1c-b08694xxxxxx.3dm" | jq '.'
    

    回应

    { "bucketKey": "wip.dm.prod", "objectId": “骨灰盒:adsk.objects:os.object:wip.dm.prod/6d106e5b-2ac6-41d5-aa1c-b08694xxxxxx.3dm”, “objectKey”:“6d106e5b-2ac6-41d5-aa1c-b08694xxxxxx.3dm”,“sha1”: "9c8e51403adc6b3bb6f586433bca66689xxxxxx", "尺寸": 107743049,
    “contentType”:“应用程序/x-www-form-urlencoded”,“位置”: “https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/6d106e5b-2ac6-41d5-aa1c-b08694xxxxxx.3dm” }

    最后是第 5 步:创建上传文件的第一个版本

    curl -X POST -H "Authorization: Bearer OC5yVHwVyjZRfxQhXJjxxxxxxxx" -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d '{
        "jsonapi": { "version": "1.0" },
        "data": {
          "type": "items",
          "attributes": {
            "displayName": "lego-racecar.3dm",
            "extension": {
              "type": "items:autodesk.core:File",
              "version": "1.0"
            }
          },
          "relationships": {
            "tip": {
              "data": {
                "type": "versions", "id": "1"
              }
            },
            "parent": {
              "data": {
                "type": "folders",
                "id": "urn:adsk.wipprod:fs.folder:co.BKklEuaHRsiii-mKNxxxxxx"
              }
            }
          }
        },
        "included": [
          {
            "type": "versions",
            "id": "1",
            "attributes": {
              "name": "lego-racecar.3dm",
              "extension": {
                "type": "versions:autodesk.core:File",
                "version": "1.0"
              }
            },
            "relationships": {
              "storage": {
                "data": {
                  "type": "objects",
                  "id": "urn:adsk.objects:os.object:wip.dm.prod/6d106e5b-2ac6-41d5-aa1c-b08694xxxxxx.3dm"
                }
              }
            }
          }
        ]
      }' "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/items" | jq '.'
    

    回应

    { “jsonapi”:{ “版本”:“1.0”},“链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dWUyOTg4MTEzMSMyMDE2MDYxNTM1MDA2NjA2/items/urn%3Aadsk.wipprod%3Adm.lineage%3ABlMbtGTyQ2eMLvZ05rVvAg" } }, “数据”: { “类型”:“项目”, "id": "urn:adsk.wipprod:dm.lineage:BlMbtGTyQ2eMLvZ05rVvAg", “属性”: { "displayName": "lego-racecar.3dm", "createTime": "2016-11-02T18:49:51+00:00", "createUserId": "TNSUM9VPW79S", "lastModifiedTime": "2016-11-02T18:49:51+00:00", "lastModifiedUserId": "TNSUM9VPW79S", “延期”: { “类型”:“项目:autodesk.core:文件”, “版本”:“1.0”, “模式”:{ "href": "https://developer.api.autodesk.com/schema/v1/versions/items%3Aautodesk.core%3AFile-1.0" }, “数据”: {} } }, “链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dWUyOTg4MTEzMSMyMDE2MDYxNTM1MDA2NjA2/items/urn%3Aadsk.wipprod%3Adm.lineage%3ABlMbtGTyQ2eMLvZ05rVvAg" } }, “关系”:{ “提示”: { “数据”: { “类型”:“版本”, "id": "urn:adsk.wipprod:fs.file:vf.BlMbtGTyQ2eMLvZ05rVvAg?version=1" }, “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dWUyOTg4MTEzMSMyMDE2MDYxNTM1MDA2NjA2/items/urn%3Aadsk.wipprod%3Adm.lineage%3ABlMbtGTyQ2eMLvZ05rVvAg/tip" } } }, “版本”:{ “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dWUyOTg4MTEzMSMyMDE2MDYxNTM1MDA2NjA2/items/urn%3Aadsk.wipprod%3Adm.lineage%3ABlMbtGTyQ2eMLvZ05rVvAg/versions" } } }, “父母”:{ “数据”: { “类型”:“文件夹”, "id": "urn:adsk.wipprod:fs.folder:co.YgCsk6CGSUSTFeexhncYNw" }, “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dWUyOTg4MTEzMSMyMDE2MDYxNTM1MDA2NjA2/items/urn%3Aadsk.wipprod%3Adm.lineage%3ABlMbtGTyQ2eMLvZ05rVvAg/parent" } } }, “参考”:{ “链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dWUyOTg4MTEzMSMyMDE2MDYxNTM1MDA2NjA2/items/urn%3Aadsk.wipprod%3Adm.lineage%3ABlMbtGTyQ2eMLvZ05rVvAg/relationships/refs" }, “有关的”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dWUyOTg4MTEzMSMyMDE2MDYxNTM1MDA2NjA2/items/urn%3Aadsk.wipprod%3Adm.lineage%3ABlMbtGTyQ2eMLvZ05rVvAg/refs" } } }, “链接”:{ “链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dWUyOTg4MTEzMSMyMDE2MDYxNTM1MDA2NjA2/items/urn%3Aadsk.wipprod%3Adm.lineage%3ABlMbtGTyQ2eMLvZ05rVvAg/relationships/links" } } } } }, “包括”: [ { “类型”:“版本”, "id": "urn:adsk.wipprod:fs.file:vf.BlMbtGTyQ2eMLvZ0xxxxxx?version=1", “属性”: { “名称”:“乐高赛车.3dm”, "displayName": "lego-racecar.3dm", "createTime": "2016-11-02T18:49:51+00:00", "createUserId": "TNSUM9VPxxxxxx", "lastModifiedTime": "2016-11-02T18:49:51+00:00", "lastModifiedUserId": "TNSUM9VPxxxxxx", “版本号”:1, "mimeType": "application/vnd.autodesk.rhinoceros", “存储大小”:107743049, “文件类型”:“3dm”, “延期”: { “类型”:“版本:autodesk.core:文件”, “版本”:“1.0”, “模式”:{ "href": "https://developer.api.autodesk.com/schema/v1/versions/versions%3Aautodesk.core%3AFile-1.0" }, “数据”: {} } }, “链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/versions/urn%3Aadsk.wipprod%3Afs.file%3Avf.BlMbtGTyQ2eMLvZ05rVvAg%3Fversion%3D1" } }, “关系”:{ “物品”: { “数据”: { “类型”:“项目”, "id": "urn:adsk.wipprod:dm.lineage:BlMbtGTyQ2eMLvZ0xxxxxxx" }, “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/versions/urn%3Aadsk.wipprod%3Afs.file%3Avf.BlMbtGTyQ2eMLvZ05rVvAg%3Fversion%3D1/item" } } }, “链接”:{ “链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/versions/urn%3Aadsk.wipprod%3Afs.file%3Avf.BlMbtGTyQ2eMLvZ05rVvAg%3Fversion%3D1/relationships/links" } } }, “参考”:{ “链接”:{ “自己”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/versions/urn%3Aadsk.wipprod%3Afs.file%3Avf.BlMbtGTyQ2eMLvZ05rVvAg%3Fversion%3D1/relationships/refs" }, “有关的”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/versions/urn%3Aadsk.wipprod%3Afs.file%3Avf.BlMbtGTyQ2eMLvZ05rVvAg%3Fversion%3D1/refs" } } }, “下载格式”:{ “链接”:{ “有关的”: { "href": "https://developer.api.autodesk.com/data/v1/projects/a.cGVyc29uYWw6dxxxxxxxxxxxxxxxxxQwNjEwMTQ3NDA1MQ/versions/urn%3Aadsk.wipprod%3Afs.file%3Avf.BlMbtGTyQ2eMLvZ05rVvAg%3Fversion%3D1/downloadFormats" } } }, “衍生物”:{ “数据”: { “类型”:“衍生物”, “id”:“dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkJsTWJ0R1R5UTJlTUx2WjA1clZ2QWc_dmVxxxxxxxxx” }, “元”:{ “关联”: { "href": "https://developer.api.autodesk.com/modelderivative/v2/designdata/dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkJsTWJ0R1R5UTJlTUx2WjA1clZ2QWc_dmVxxxxxxxx/manifest" } } }, “缩略图”:{ “数据”: { “类型”:“缩略图”, “id”:“dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkJsTWJ0R1R5UTJlTUx2WjA1clZ2QWc_dmVxxxxxxxxx” }, “元”:{ “关联”: { "href": "https://developer.api.autodesk.com/modelderivative/v2/designdata/dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkJsTWJ0R1R5UTJlTUx2WjA1clZ2QWc_dmVyc2lxxxxx/thumbnail" } } }, “贮存”: { “数据”: { “类型”:“对象”, "id": "urn:adsk.objects:os.object:wip.dm.prod/6d106e5b-2ac6-41d5-aa1c-b086943xxxxx.3dm" }, “元”:{ “关联”: { "href": "https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/6d106e5b-2ac6-41d5-aa1c-b086943xxxxx.3dm" } } } } } ] }

    它可能包含一些信息,但这是我遵循的过程,并且之前已经工作过。您可以像我之前所说的那样尝试它,让 Postman 执行一组 REST 调用,然后再构建您的 ajax 调用。

    【讨论】:

      猜你喜欢
      • 2022-12-22
      • 2020-01-28
      • 2017-12-07
      • 2017-01-12
      • 2021-09-01
      • 2017-09-29
      • 2021-08-16
      • 2019-03-24
      • 2017-10-04
      相关资源
      最近更新 更多