繁体   English   中英

Dropbox API HTTP Unity3d上传下载

[英]Dropbox API HTTP Unity3d upload download

由于没有对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的路径部分是否正确...我的应用只能访问它自己的文件夹,但是我真的不知道我是否应该始终使用完整路径...我尝试过无论如何,但是我遇到了同样的错误(我从意大利语的“ Applicazioni”中复制了在授权部分和MyAppName之后自动创建的应用程序的路径...我没有尝试将/ home /添加到该路径)。 我不确定覆盖是否与autorename true兼容。 我不确定是否必须使用application / octet-stream或application / json,但我同时尝试了两者并得到了相同的Error 400。

所以我认为问题可能出在--data-binary。 现在,我读取了所有文件文本,并将其转换为字节数组...通常这对-d(数据)有效,但对--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是很好的。Bearer可以工作。覆盖与autorename true兼容,Content-type application / octet-stream很好。而且get只打印文件,所以我真的不知道为什么它没有错误(但是已经太晚了,也许对于下载来说,问题是代码中的错误,我今天将再试一次。

唯一真正的区别是,在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。

由于某种原因,上传代码实际上是有效的。 也许是操作系统,还是统一版本(昨天更新了版本,但在家里我仍在使用旧版本...),现在唯一的问题是我仍然不知道如何下载。

编辑4。

好的,新问题。 我尝试使用UnityWebRequest类(对于Post而言不起作用),然后更改为Get(因为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);
        }
    }

好的,多亏了格雷格(Greg)的建议,我才得以考虑在Google上解决下载问题。 就像我说的那样,上传是可行的(即使在Unity.3d的2018.1版本上也可以。在这篇文章之后,我将上传以查看2018.2是否仍然可行)。 我真的不知道为什么昨天我不能上传文件(也许我的代码是错误的,例如在url中,我没有注意到)。

无论如何,对于下载部分,我终于能够理解问题所在:Content-Type。 对于下载,Dropbox要求使用一个空的“”内容类型(但我在文档中没有看到它,我能够在此处找到此信息: Dropbox下载文件API停止工作并出现400错误 )。

从那里开始,解决方案很容易。 我再次使用了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);
        }
    }

最后,我可以完成我的保存云解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM