Dropbox API HTTP Unity3d 上传下载
Dropbox API HTTP Unity3d upload download
由于没有对 Unity3d 和 Dropbox 的官方支持,我使用的是 HTTP API。
我能够使用代码流(通过在 Unity3d 中使用 Application.OpenURL)和 oauth2/token Post 部分(所以我能够登录并获得我从 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
我确定我的 post 是正确的,因为我对登录部分也做了同样的事情。
我确定承载 header 是正确的。
我不确定 Dropbox-API-Arg 的路径部分是否正确...我的应用程序只能访问它自己的文件夹,但我真的不知道我是否应该始终使用完整路径...我试过了无论如何,但我遇到了同样的错误(我从 "Applicazioni" 意大利语复制了授权部分和 MyAppName 之后自动创建的应用程序的路径...我没有尝试将 /home/ 添加到路径中)。
我不确定覆盖是否与 autorename true 兼容。
我不确定我是否必须使用 application/octet-stream 或 application/json 但我尝试了两者并得到了相同的错误 400.
所以我认为问题可能在于--data-binary。
现在我读取所有文件文本并将其转换为字节数组...通常这适用于 -d (数据)但也许这对 --data-binary.
是错误的
我还尝试从保管箱生成访问令牌(避免授权部分的临时解决方案只能使用您自己的帐户...因为我不知道不记名代码是否会过期)但这是没有帮助。我仍然收到错误 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 工作。
overwrite 与 autorename true 兼容,Content-type application/octet-stream 很好。
另外 get 只打印文件,所以我真的不知道为什么它没有错误地工作(但已经晚了,也许对于下载问题是代码中的错误,我今天会再试一次)。
唯一真正的区别是,在 Unity 中,我将文件作为文本读取 -> 转换为字节数组 -> 在 body...
在卷曲我使用 --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\"}"
这是有效的,return 一个字符串到终端。
在 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.
出于某种原因,上传代码确实有效。可能是OS,也可能是unity版本(昨天更新了,我在家还是用老版本。。。)反正现在唯一的问题是我还是不会知道怎么下载了。
编辑4.
好的新问题。我尝试使用 UnityWebRequest class(对于 Post 不起作用)并且我更改为 Get(因为使用 curl 仍然有效。
使用此代码下载 return 成功....但文件为空
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 上搜索有关下载问题的内容。
就像我说的那样上传有效(即使在 2018.1 版本的 Unity3d 上。我将在此 post 之后上传以查看 2018.2 是否仍然有效)。我真的不知道为什么昨天我无法上传文件(也许我的代码在 url 中是错误的,但我没有注意到)。
无论如何,对于下载部分,我终于能够理解问题所在:
Content-Type。
Dropbox,下载,需要一个空的“”内容类型(但我没有在文档中看到它,我可以在这里找到这个信息:
Dropbox download file API stopped working with 400 error
).
从那里解决方案很简单。我再次使用 WWW class(UnityWebRequest Post 由于某种原因仍然损坏),并且使用这段代码我能够获取我的 json 文件的文本(刚刚添加了一个 header):
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);
}
}
我终于可以完成我的保存云解决方案了。
由于没有对 Unity3d 和 Dropbox 的官方支持,我使用的是 HTTP API。 我能够使用代码流(通过在 Unity3d 中使用 Application.OpenURL)和 oauth2/token Post 部分(所以我能够登录并获得我从 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
我确定我的 post 是正确的,因为我对登录部分也做了同样的事情。 我确定承载 header 是正确的。 我不确定 Dropbox-API-Arg 的路径部分是否正确...我的应用程序只能访问它自己的文件夹,但我真的不知道我是否应该始终使用完整路径...我试过了无论如何,但我遇到了同样的错误(我从 "Applicazioni" 意大利语复制了授权部分和 MyAppName 之后自动创建的应用程序的路径...我没有尝试将 /home/ 添加到路径中)。 我不确定覆盖是否与 autorename true 兼容。 我不确定我是否必须使用 application/octet-stream 或 application/json 但我尝试了两者并得到了相同的错误 400.
所以我认为问题可能在于--data-binary。 现在我读取所有文件文本并将其转换为字节数组...通常这适用于 -d (数据)但也许这对 --data-binary.
是错误的我还尝试从保管箱生成访问令牌(避免授权部分的临时解决方案只能使用您自己的帐户...因为我不知道不记名代码是否会过期)但这是没有帮助。我仍然收到错误 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 工作。 overwrite 与 autorename true 兼容,Content-type application/octet-stream 很好。 另外 get 只打印文件,所以我真的不知道为什么它没有错误地工作(但已经晚了,也许对于下载问题是代码中的错误,我今天会再试一次)。
唯一真正的区别是,在 Unity 中,我将文件作为文本读取 -> 转换为字节数组 -> 在 body... 在卷曲我使用 --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\"}"
这是有效的,return 一个字符串到终端。
在 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.
出于某种原因,上传代码确实有效。可能是OS,也可能是unity版本(昨天更新了,我在家还是用老版本。。。)反正现在唯一的问题是我还是不会知道怎么下载了。
编辑4.
好的新问题。我尝试使用 UnityWebRequest class(对于 Post 不起作用)并且我更改为 Get(因为使用 curl 仍然有效。 使用此代码下载 return 成功....但文件为空
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 上搜索有关下载问题的内容。 就像我说的那样上传有效(即使在 2018.1 版本的 Unity3d 上。我将在此 post 之后上传以查看 2018.2 是否仍然有效)。我真的不知道为什么昨天我无法上传文件(也许我的代码在 url 中是错误的,但我没有注意到)。
无论如何,对于下载部分,我终于能够理解问题所在: Content-Type。 Dropbox,下载,需要一个空的“”内容类型(但我没有在文档中看到它,我可以在这里找到这个信息: Dropbox download file API stopped working with 400 error ).
从那里解决方案很简单。我再次使用 WWW class(UnityWebRequest Post 由于某种原因仍然损坏),并且使用这段代码我能够获取我的 json 文件的文本(刚刚添加了一个 header):
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);
}
}
我终于可以完成我的保存云解决方案了。