因为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);
}
}