【问题标题】:Uploading blob to Azure with Unity使用 Unity 将 blob 上传到 Azure
【发布时间】:2016-10-17 08:57:02
【问题描述】:

我正在尝试将数据上传到 Azure 门户上的 blob 服务。

我一直在尝试使用这个页面:https://msdn.microsoft.com/library/azure/dd179451.aspx

我的代码如下:

IEnumerator SetItem ()
{
    DataJson data = new DataJson("Amy", "201289");
    string json = JsonUtility.ToJson(data);
    UnityWebRequest newWWW = UnityWebRequest.Put(
        "https://compstorage.blob.core.windows.net/folderName/item", json);
    yield return newWWW.Send();
    if (newWWW.isError == false)
    {
        Debug.Log("Form upload complete!");
    }
    UnityWebRequest www = UnityWebRequest.Get("compstorage.blob.core.windows.net/folderName/item.json");
    yield return www.Send();
    string text = System.Text.Encoding.UTF8.GetString(www.downloadHandler.data);
    DataJson newData = JsonUtility.FromJson<DataJson>(text);
    Debug.Log(newData.ToString()); 
}

blob 设置为 Blob,意思是读、写权限。我尝试了各种变体,例如添加/删除文件扩展名,还添加了 SaS 密钥,但它从不更新服务器内容,尽管 Put 请求声称成功。 Get 请求工作正常,但打印的是旧版本的数据,而不是更新的数据。

有谁知道Unity中Put请求的使用方法

【问题讨论】:

  • 您是否从 Azure 存储收到任何错误消息?
  • 没有,一切正常。我试图从 uploadHandler 读取内容,但没有。
  • 这很奇怪!通常应该从 Azure 存储报告一些错误。但有一件事:将容器的 ACL 设置为 Blob 在这种情况下无济于事。请参阅此线程以获取更多详细信息:stackoverflow.com/questions/40017960/…。您提到您也尝试过使用 SAS。你的 SAS 有 Write 权限吗?
  • 这一切都有。我试图附加 SAS,但没有任何反应。我想我一定在某处遗漏了一件事。我会继续努力的。
  • 您可能会发现这个显示各种 PUT 身份验证 blob 请求的示例 Unity 项目很有用 - github.com/Unity3dAzure/StorageServicesDemo

标签: c# azure unity3d


【解决方案1】:

不知道为什么会发生这种情况,但您可以使用 this 插件与您的 Azure 服务进行通信。它会解决你的问题。

编辑

阅读您发布的 MS 链接后,问题是您缺少几个标题:

  • 授权
  • 日期或 x-ms-date
  • x-ms-版本
  • 内容长度
  • x-ms-blob 类型

请理解存在类型的 blob。您没有提及您正在发出的 blob 请求的类型。请再次查看 link 以查看每个 blob 需要哪些额外的标头。如果描述中显示“必需”,那么您必须将其包含在请求中。如果它显示“可选”,则不需要它。

如何在 UnityWebRequest 中包含标题?

UnityWebRequest newWWW = UnityWebRequest.Put("https://compstorage.blob.core.windows.net/folderName/item", json);
newWWW.SetRequestHeader("Authorization","your Authorization");
newWWW.SetRequestHeader("x-ms-version","v1");
newWWW.SetRequestHeader("x-ms-blob-type","BlockBlob");
newWWW.SetRequestHeader("x-ms-date","Your Datte");

不用担心 Content-LengthDate 标头,因为 Unity 会自动为您生成它们。无论如何,您都不允许使用UnityWebRequest 手动设置它们。查看here 为授权标头添加的内容。

【讨论】:

  • 上传 blob 是 PUT 请求,而不是 PATCH 请求。
  • 刚刚注意到。固定!
  • 我会更深入地了解一下,但乍一看,它似乎是对 UnityWebRequest 类的重写。大多数情况下,我需要一个 PUT 请求,但这似乎是针对 GET/POST 和表的。我会看到的。
  • @Everts 嘿,看看编辑后的答案。它应该带你去解决你的问题。
  • 是的,基本上是我的授权错了。我需要弄清楚如何填充该字段。似乎我应该创建一个信息字符串,用一些 HMAC-SHA256 转换它,然后传递它。
猜你喜欢
  • 1970-01-01
  • 2021-01-11
  • 2017-01-06
  • 2017-03-14
  • 2017-07-10
  • 2012-02-18
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多