当前位置: 首页 > 知识库问答 >
问题:

Dropbox API HTTP Unity3d上传下载

尉迟远
2023-03-14

由于没有对Unity3d和Dropbox的官方支持,我使用的是HTTP API。我可以使用代码流(通过在Unity3d中使用Application.OpenURL)执行oauth2/authorize,也可以执行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

我确信我的帖子是正确的,因为我对登录部分也做了同样的事情。我确信承载头是正确的。我不确定Dropbox-API-Arg的路径部分是正确的...我的应用程序只能访问它自己的文件夹,但我真的不知道我是否应该始终使用完整的路径...我还是尝试了一下,但我得到了同样的错误(我从“Applazion i”意大利语复制了路径,用于在授权部分和MyAppName之后自动创建的应用程序...我没有尝试将 /home/添加到路径中)。我不确定覆盖是否与autorename true兼容。我不确定我是否必须使用应用程序/八位流或应用程序/json,但我两者都尝试了,得到了相同的错误400。

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

我还尝试从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很好。承载工作。覆盖与autorename true兼容,Content-type Application/octet-stream很好。此外,只有获取打印文件,所以我真的不知道为什么它不能正常工作,没有错误(但它很晚了,也许下载的问题是代码中的错误,我今天会再试一次)。

唯一真正的区别是,在Unity中,我将文件作为文本阅读-

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

源自curl

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(因为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个答案

祁杰
2023-03-14

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

无论如何,对于下载部分,我终于能够理解问题所在:内容类型。下载时,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);
        }
    }

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

 类似资料:
  • 问题内容: 设置INTERNET_ACCESS等后,出现此错误。 这是我测试过的代码的另一部分,仍然收到该异常 } 问题答案: “ftp.194.90.81.149”: No address associated with hostname 您收到UnknownHostException的事实意味着ftp.194.90.81.149在DNS中不是真实的主机名。我怀疑其中的数字部分是您真正想要的。即

  • 本文向大家介绍Jsp+Servlet实现文件上传下载 文件上传(一),包括了Jsp+Servlet实现文件上传下载 文件上传(一)的使用技巧和注意事项,需要的朋友参考一下 文件上传和下载功能是Java Web必备技能,很实用。 本文使用的是Apache下的著名的文件上传组件 org.apache.commons.fileupload 实现 下面结合最近看到的一些资料以及自己的尝试,先写第一篇文件上

  • 本文向大家介绍linux下上传下载文件夹的方法,包括了linux下上传下载文件夹的方法的使用技巧和注意事项,需要的朋友参考一下 Linux下目录复制:本机->远程服务器 test1为源目录,test2为目标目录,zhidao@192.168.0.1为远程服务器的用户名和ip地址。 Linux下目录复制:远程服务器->本机 zhidao@192.168.0.1为远程服务器的用户名和ip地址,test

  • 本文向大家介绍C++文件上传、下载工具,包括了C++文件上传、下载工具的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++文件上传下载的实现代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助。

  • 我试图用PythonAnywhere和Flask编写一个非常简单的webapp,它允许用户上传文本文件,生成csv文件,然后让用户下载csv文件。不一定要花哨,只要管用就行了。我已经编写了从驱动器上的txt文件生成csv的程序。 现在,我的函数用以下命令打开驱动器上的文件:

  • 我需要创建一个从APIendpoint下载文件并将其上传到另一个APIendpoint的进程。该文件的最大大小为100MB,但我们将有许多进程并行运行。我试图用Spring WebClient实现它,而不需要将文件存储在内存中。当前代码将文件存储在内存中,因为使用大文件的测试会抛出OutofMemoryError。