【问题标题】:Uploading file to Dropbox with Devdefined OAuth library使用 Devdefined OAuth 库将文件上传到 Dropbox
【发布时间】:2011-12-29 04:22:55
【问题描述】:

我正在尝试将文件上传到 Dropbox REST Web 服务,同时使用 Devdefined 的 OAuth 库。

这是我正在使用的方法:

    public static void UploadFile(string filenameIn, string directoryIn, byte[] dataIn)
    {
        DropBox.session.Request().Put().ForUrl("https://api-content.dropbox.com/1/files_put/" + directoryIn + filenameIn)
            .WithQueryParameters(new { param = dataIn });
    }

该方法似乎没有做任何事情,也没有抛出任何异常。输出中也没有错误。我已经尝试使用断点来确认它也在调用代码。

【问题讨论】:

    标签: c# rest dropbox devdefined-oauth


    【解决方案1】:

    您没有收到错误的原因是因为请求没有被执行 - 要执行请求,您需要获取响应 - 有很多方法可以做到这一点,但通常最简单的方法就是获取使用 ReadBody() 方法返回文本。

    上传文件的内容不能作为查询参数完成 - 根据 dropbox REST API,put 请求的整个正文应该是文件的内容。

    基本上要让这一切发挥作用,您需要:

    • 根据您的 Url 中的 API 包含根路径“dropbox”或“sandbox”,我认为您缺少这些。如果您的 DropBox 应用程序已配置应用程序文件夹,则使用“沙盒”。
    • 在消费者上下文中将“UseHeaderForOAuthParameters”设置为 true,以确保 OAuth 签名等作为请求标头传递,而不是作为表单参数进行编码(因为整个正文都是原始数据)。
    • 使用“WithRawContent(byte[] contents)”方法将文件的内容添加到请求中。
    • 在 PUT 请求方法链的最后使用“ReadBody()”方法来执行请求。

    结果将是一个包含 JSON 的字符串,应该如下所示:

    {
      "revision": 5, 
      "rev": "5054d8c6e", 
      "thumb_exists": true, 
      "bytes": 5478,
      "modified": "Thu, 29 Dec 2011 10:42:05 +0000",
      "path": "/img_fa06e557-6736-435c-b539-c1586a589565.png", 
      "is_dir": false, 
      "icon": "page_white_picture",
      "root": "app_folder",
      "mime_type": "image/png",
      "size": "5.3KB"
    }
    

    我在 github 上的 DevDefined.OAuth-examples 项目中添加了一个示例,该示例演示了如何使用 DropBox 执行 GET 和 PUT 请求:

    https://github.com/bittercoder/DevDefined.OAuth-Examples/blob/master/src/ExampleDropBoxUpload/Program.cs

    下面是 put 请求特别需要的代码:

    var consumerContext = new OAuthConsumerContext
    {
        SignatureMethod = SignatureMethod.HmacSha1,
        ConsumerKey = "key goes here",
        ConsumerSecret = "secret goes here", 
        UseHeaderForOAuthParameters = true
    };
    
    var session = new OAuthSession(consumerContext, "https://api.dropbox.com/1/oauth/request_token",
       "https://www.dropbox.com/1/oauth/authorize",
       "https://api.dropbox.com/1/oauth/access_token");
    
    IToken requestToken = session.GetRequestToken();
    
    string authorisationUrl = session.GetUserAuthorizationUrlForToken(requestToken);
    
    Console.WriteLine("Authorization Url: {0}", authorisationUrl);
    
    // ... Authorize request... and then...
    
    session.ExchangeRequestTokenForAccessToken(requestToken);
    
    string putUrl = "https://api-content.dropbox.com/1/files_put/sandbox/some-image.png";
    
    byte[] contents = File.ReadAllBytes("some-image.png");
    
    IConsumerRequest putRequest = session.Request().Put().ForUrl(putUrl).WithRawContent(contents);
    
    string putInfo = putRequest.ReadBody();
    
    Console.WriteLine("Put response: {0}", putInfo);
    

    希望这能让事情弄清楚一点,不幸的是,如果没有文档,仅通过查看源代码来弄清楚这些事情有点棘手:)

    【讨论】:

    • 非常感谢,这解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多