Загрузить файл через вызов POST с C #, RestSharp, Redmine API

Я разрабатываю приложение C #, которое использует Redmine REST API, оно использует RestSharp Client. Все остальные вызовы REST, которые я выполняю, работают нормально, но я не могу найти способ загрузить вложения. Я широко искал в Интернете и пробовал много решений, но ничего не помогло. Документация Redmine по прикрепленным файлам: http://www.redmine.org/projects/redmine/wiki/Rest_api#Attaching-files На самом деле код выглядит так:

RestClient client = new RestClient("http://myclient/redmine/");
client.Authenticator = new HttpBasicAuthenticator("myuser", "mypsw");
var request2 = new RestRequest("uploads.json", Method.POST);
request2.AddHeader("Content-Type", "application/octet-stream");
request2.RequestFormat = RestSharp.DataFormat.Json;
byte[] dataToSend = File.ReadAllBytes(AddIssue.attach.Text);
request2.AddBody(dataToSend);
IRestResponse response2 = client.Execute(request2);
resultbox.Text = response2.Content;

Если я выполню его выше, ничего не произойдет, и ответ будет пустым. Если я удалю строку 7 (AddBody), она действительно работает, но, конечно, ничего не загружается, ответ JSON: {"upload": {"token": "11." }}

Итак, на самом деле, реальный вопрос заключается в том, что использовать в AddBody () для отправки файла как application / octet-stream. Поскольку у RestSharp также есть метод request.AddFile (), я тоже пробовал его разными способами, но ничего ...

Любая помощь очень ценится!


person teocomi    schedule 21.10.2013    source источник
comment
Никто? Все работает нормально, если я использую POSTMAN (плагин Chrome) и выбираю файл в форме данных ...   -  person teocomi    schedule 22.10.2013
comment
У меня аналогичные проблемы с Dropbox - для этого требуется, чтобы все тело запроса было массивом байтов (в то время как AddFile() создает форму, состоящую из нескольких частей). Загрузка в Dropbox с помощью Restsharp PCL может дать некоторые идеи.   -  person Shawn South    schedule 31.12.2014


Ответы (1)


Как я уже упоминал в своем комментарии, похоже, что у Redmine могут быть требования, аналогичные Dropbox. Вот решение, которое сработало для меня (на основе вопроса Загрузить в Dropbox с помощью Restsharp PCL ):

public static void UploadFileToDropbox(string filePath)
{
    RestClient client = new RestClient("https://api-content.dropbox.com/1/");
    IRestRequest request = new RestRequest("files_put/auto/{path}", Method.PUT);

    FileInfo fileInfo = new FileInfo(filePath);
    long fileLength = fileInfo.Length;

    request.AddHeader("Authorization", "Bearer INSERT_DEVELOPER_TOKEN_HERE");
    request.AddHeader("Content-Length", fileLength.ToString());

    request.AddUrlSegment("path", string.Format("Public/{0}", fileInfo.Name));

    byte[] data = File.ReadAllBytes(filePath);
    var body = new Parameter
    {
        Name = "file",
        Value = data,
        Type = ParameterType.RequestBody,
    };
    request.Parameters.Add(body);

    IRestResponse response = client.Execute(request);
} 

Также опубликован как Gist.

Я знаю, что это не ваша точная ситуация, но, надеюсь, это даст вам некоторые идеи.

person Shawn South    schedule 30.12.2014