Загрузка файла в Dropbox с помощью библиотеки Devdefined OAuth - PullRequest
1 голос
/ 29 декабря 2011

Я пытаюсь загрузить файл в веб-службу Dropbox REST, одновременно используя библиотеку OAuth Devdefined.

Это метод, который я использую:

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

Метод, похоже, ничего не делает и не генерирует никаких исключений. Там нет ошибок в выводе либо. Я попытался использовать точки останова, чтобы подтвердить, что он также вызывает код.

1 Ответ

3 голосов
/ 29 декабря 2011

Причина, по которой вы не получаете сообщение об ошибке, заключается в том, что запрос не выполняется - чтобы выполнить запрос, вам нужно получить ответ - существует несколько способов сделать это, но зачастую самый простой - просто извлечьВерните текст, используя метод ReadBody ().

Загрузка содержимого файла не может быть выполнена в качестве параметра запроса - согласно API REST dropbox, все тело запроса put должно быть содержимым файла.

Для того, чтобы все это работало, вам необходимо:

  • Включить корневой путь "dropbox" или "песочница" в соответствии с API в вашем URL-адресе.отсутствует.Вы используете «песочницу», если ваше приложение DropBox было сконфигурировано с папкой приложения.
  • Установите для «UseHeaderForOAuthParameters» значение true в контексте потребителя, чтобы гарантировать, что подпись OAuth и т. Д. Передается как заголовки запроса, а некодируется как параметры формы (поскольку все тело является необработанными данными).
  • Используйте метод WithRawContent (byte [] contents) ", чтобы добавить содержимое файла в запрос.
  • ИспользуйтеМетод «ReadBody ()» в самом конце цепочки методов запроса PUT, чтобы вызвать выполнение запроса.

Результатом будет строка, содержащая 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"
}

Я добавил пример для проекта DevDefined.OAuth-examples на github, который демонстрирует, как выполнять запросы GET и PUT с DropBox:

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

А вот код, специально необходимый для запроса пут:

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);

Надеюсь, это немного прояснит ситуацию, к сожалению, без документацииЭто немного сложно понять, просто взглянув на исходный код:)

...