Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dropbox API HTTP Unity3d上传下载_C#_Unity3d_Dropbox Api - Fatal编程技术网

C# Dropbox API HTTP Unity3d上传下载

C# Dropbox API HTTP Unity3d上传下载,c#,unity3d,dropbox-api,C#,Unity3d,Dropbox Api,因为Unity3d和Dropbox没有官方支持,所以我使用的是HTTP API。 我能够使用代码流(通过在Unity3d中使用Application.OpenURL)执行oauth2/authorize,也能够执行oauth2/token Post部分(因此我能够登录并获得从oauth2/authorize获得的代码) 问题是我真的不知道如何上传和下载文件。 我尝试的内容(此代码在协同程序中): 我从中得到错误400 Dropbox医生说 curl -X POST https://content

因为Unity3d和Dropbox没有官方支持,所以我使用的是HTTP API。 我能够使用代码流(通过在Unity3d中使用Application.OpenURL)执行oauth2/authorize,也能够执行oauth2/token Post部分(因此我能够登录并获得从oauth2/authorize获得的代码)

问题是我真的不知道如何上传和下载文件。 我尝试的内容(此代码在协同程序中):

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

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

我还尝试从dropbox生成访问令牌(这是一个临时解决方案,可以避免授权部分,它只对您自己的帐户起作用……因为我不知道承载码是否会过期),但这没有帮助。我仍然得到错误400

下载:

https://content.dropboxapi.com/2/files/download
我没有得到任何错误。但我不知道如何决定下载文件夹,所以我没有得到任何文件

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

编辑。 我在linux终端上尝试了curl(在家里,我使用Windows,所以我没有curl),并且我能够用curl上传和下载(我对它从应用程序文件夹开始的路径是正确的),所以/uploadtry.json很好。 持票人工作。 覆盖与autorename true兼容,内容类型应用程序/八位字节流良好。 另外,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);
        }
    }

好的,多亏了格雷格·萨格西翁,我才能够想到一些东西来搜索谷歌的下载问题。 正如我所说,上传是有效的(即使是在Unity3d的2018.1版本上。我会在这篇文章之后上传,看看2018.2是否仍然有效)。我真的不知道为什么昨天我无法上传文件(可能是我的代码错了,例如在url中,我没有注意到)

无论如何,对于下载部分,我终于能够理解问题所在: 内容类型。 下载时,Dropbox需要一个空的“”内容类型(但我在文档中没有看到它,我可以在这里找到此信息: )

从那里,解决方案很简单。我再次使用了WWW类(UnityWebRequest Post由于某种原因仍处于中断状态),通过这段代码,我能够获得json文件的文本(只是添加了一个标题):


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

每当您收到错误响应时,例如您提到的400状态代码,请打印响应正文以获得更具体的错误消息。@Programmer您应该能够通过一个简单的dropbox帐户->创建应用程序(在站点中)获得承载代码->生成。我无法共享该代码,因为它会将所有内容上载到我的个人帐户。抱歉。无论如何,我在家里尝试了上载,并且成功了(我真的不知道我昨天做了什么不同)。现在我只需要了解如何使下载工作正常。@Greg感谢您的建议
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);
        }
    }
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);
        }
    }