代码之家  ›  专栏  ›  技术社区  ›  LiefLayer

Dropbox API HTTP Unity3D上传下载

  •  0
  • LiefLayer  · 技术社区  · 7 年前

    因为Unity3D和Dropbox没有官方支持,所以我使用的是HTTP API。 我可以使用代码流(在unity3d中使用application.openurl)和oauth2/token post部分来完成oauth2/authorize(所以我可以登录并获取从oauth2/authorize获得的代码)。

    问题是我真的不知道如何上传和下载文件。 我试过的(这段代码在一个协程中):

    Dictionary<string, string> postHeader = new Dictionary<string, string>();
    postHeader.Add("Authorization", "Bearer <code>");
    postHeader.Add("Dropbox-API-Arg", "{\"path\": \"/uploadtry.json\",\"mode\": \"overwrite\",\"autorename\": true,\"mute\": false}");
    postHeader.Add("Content-Type", "application/octet-stream");
    byte[] myData = System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(Application.persistentDataPath + "/" + "uploadtry.json"));
    using (WWW www = new WWW("https://content.dropboxapi.com/2/files/upload", myData, postHeader)) {
      yield return www;
      if (www.error != null) {
        Debug.Log(www.error);
      } else {
        Debug.Log("Success! " + www.text);
      }
    }
    

    我从这里得到错误400。

    Dropbox文档说

    curl -X POST https://content.dropboxapi.com/2/files/upload \
    --header "Authorization: Bearer <code>" \
    --header "Dropbox-API-Arg: {\"path\": \"/Homework/math/Matrices.txt\",\"mode\": \"add\",\"autorename\": true,\"mute\": false}" \
    --header "Content-Type: application/octet-stream" \
    --data-binary @local_file.txt
    

    我确信我的帖子是正确的,因为我在登录部分也做了同样的工作。 我确信不记名抬头是对的。 我不确定Dropbox API arg的路径部分是否正确…我的应用程序只能访问它自己的文件夹,但我不知道是否应该一直使用完整路径…无论如何我都试过了,但是我也犯了同样的错误(我复制了“applicationi”意大利语中的路径,用于在授权部分和myappname之后自动创建的应用程序……我没有尝试将/home/添加到路径)。 我不确定overwrite是否与autorename true兼容。 我不确定是否必须使用application/octet stream或application/json,但我尝试了两者,得到了相同的错误400。

    所以我认为问题可能是--数据二进制。 现在我读取所有文件文本并将其转换为字节数组…通常这对-d(data)有效,但对-data binary可能是错误的。

    我还试图从dropbox生成访问令牌(临时解决方案,以避免授权部分的唯一工作与您自己的帐户…因为我不知道不记名密码是否可以过期),但这没有帮助。我还是有错误400。

    下载:

    https://content.dropboxapi.com/2/files/download
    

    我没有任何错误。但我不知道如何决定下载文件夹,所以我没有得到任何文件。

    https://www.dropbox.com/developers/documentation/http/documentation#files-download

    我不明白如何在(get?)中指定下载文件夹。? 我真的很困惑。

    编辑。 我在Linux终端上试过curl(在家里我用的是Windows,所以我没有curl),我可以用curl上传和下载(我对它从应用程序文件夹开始的路径是正确的,所以/uploadtry.json很好)。 持票人工作。 overwrite与autorename true兼容,内容类型application/octet stream很好。 另外,get-only会打印文件,所以我不知道为什么没有错误(但已经晚了,可能是因为下载的问题是代码中的错误,我今天会再试一次)。

    唯一真正的区别是,在unity中,我将文件读取为文本->转换为正文中的字节数组->发送… 在curl中,我使用--data binary@path/to/file.json 可能是因为如果我传递一个简单的字节数组,就没有名字…我真的不知道。 如果我找到解决方案,我会更新,但如果你有一个想法,我很感激。

    编辑2. 再次尝试下载仍然不起作用。错误400错误请求

    从卷曲

    curl -X POST https://content.dropboxapi.com/2/files/download     --header "Authorization: Bearer <code>" --header "Dropbox-API-Arg: {\"path\": \"/prova.json\"}"
    

    这正在工作并将字符串返回到终端。

    在Unity3D上

    Dictionary<string, string> postHeader = new Dictionary<string, string>();
    postHeader.Add("Authorization", "Bearer <code>");
    postHeader.Add("Dropbox-API-Arg", "{\"path\": \"/prova.json\"}");
    using (WWW www = new WWW("https://content.dropboxapi.com/2/files/download", null, postHeader)){
        yield return www;
        if (www.error != null){
            Debug.Log(www.error);
        }else{
            Debug.Log("Success! " + www.text);
        }
    }
    

    这不管用。

    我真的不知道我做错了什么。

    编辑3.

    出于某种原因,上传代码实际上正在工作。也许是操作系统,也许是Unity版本(他们昨天更新了,但在家里我还在用旧版本……)总之,现在唯一的问题是我仍然不知道如何下载。

    编辑4.

    好的,新问题。我试过使用unityWebrequest类(post的类不工作),然后改为get(因为with curl仍在工作)。 使用此代码,下载返回成功….但是文件是空的

    using (UnityWebRequest www = UnityWebRequest.Get("https://content.dropboxapi.com/2/files/download"))
        {
            www.SetRequestHeader("Authorization", "Bearer <code>");
            www.SetRequestHeader("Dropbox-API-Arg", "{\"path\": \"/prova.json\"}");
            yield return www;
            if (www.error != null)
            {
                Debug.Log(www.error);
            }
            else
            {
                Debug.Log("Success! " + www.downloadHandler.data.Length);
            }
        }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   LiefLayer    7 年前

    好吧,多亏了Greg Suggesion,我才想到了一些可以在谷歌上搜索的下载问题。 就像我说的上传成功了(甚至在Unity3D的2018.1版本上。我会在这篇文章之后上传,看看2018.2是否仍然有效)。我真的不知道为什么昨天我不能上传文件(也许我的代码是错误的,例如在url中,我没有注意到)。

    不管怎样,在下载部分,我终于明白了问题所在: 内容类型。 Dropbox需要一个空的“”内容类型(但在文档中看不到,我可以在这里找到这些信息: Dropbox download file API stopped working with 400 error )中。

    从那里解决问题很容易。我再次使用了www类(unitywebrequest post由于某些原因仍然中断),通过这段代码,我可以获得json文件的文本(只是添加了一个头):

    Dictionary<string, string> postHeader = new Dictionary<string, string>();
        postHeader.Add("Authorization", "Bearer <code>");
        postHeader.Add("Dropbox-API-Arg", "{\"path\": \"/provaupload.json\"}");
        postHeader.Add("Content-Type", "");
        using (WWW www = new WWW("https://content.dropboxapi.com/2/files/download", null, postHeader)) {
            yield return www;
            if (www.error != null) {
                Debug.Log(www.error + " " + www.text);
            } else {
                Debug.Log("Success! " + www.text);
            }
        }
    

    最后我可以完成我的save云解决方案。