Я пытаюсь отправить документ (любой тип файла) на сервер GLPI через API REST.

Вот что я делаю:

private void button11_Click(object sender, EventArgs e)
{
    using (var client = new HttpClient())
    {
        using (var content = new MultipartFormDataContent())
        {
            var rcontent = string.Empty;
            // HEADERS (URL + Access Tokens)

            //string _ContentType = "multipart/form-data";
            string _Uri = Properties.Settings.Default.GLPI_URL + "/Document/";

            client.BaseAddress = new Uri(_Uri);
            //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_ContentType));
            client.DefaultRequestHeaders.Add("Session-Token", Properties.Settings.Default.GLPI_SESSION_TOKEN);
            client.DefaultRequestHeaders.Add("App-Token", Properties.Settings.Default.GLPI_APP_TOKEN);

            // JSON Content (input string array with file uploaded informations)

            JSON_C.DocumentAdder JSONContent = new JSON_C.DocumentAdder();
            JSONContent.name = "sth";
            JSONContent._filename = filebytes;
            HttpContent _JSONContent = new StringContent("uploadManifest={\"input\": " + JsonConvert.SerializeObject(JSONContent).ToString() + "}", Encoding.UTF8, "application/json");
            content.Add(_JSONContent);

            // File Content in bytes
            var fileContent = new ByteArrayContent(filebytes);
            fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("_filename") { FileName = filepath };
            //fileContent.ReadAsByteArrayAsync();
            content.Add(fileContent);

            // Request
            HttpResponseMessage reponse;
            var _Method = new HttpMethod("POST");
            reponse = client.PostAsync(_Uri, content).Result;

            // Request response
            rcontent = reponse.Content.ReadAsStringAsync().Result;

            textBox2.Text = reponse.ToString() + Environment.NewLine + rcontent.ToString();
        }
    }
}

Но вот что я получил в ответ:

StatusCode: 400, ReasonPhrase: «Плохой запрос», версия: 1.1, содержимое: System.Net.Http.StreamContent, заголовки:
{
Подключение: закрыть
Cache-Control: без сохранения, необходимость повторной проверки, без кеширования
Дата: пн, 26 ноя 2018 12:50:09 GMT
Сервер: Apache / 2.4.29
Сервер: (Ubuntu)
Длина содержимого: 61
Тип содержимого: приложение / json; charset = UTF-8
Истекает: Mon, 26 Jul 1997 05:00:00 GM
}

С участием:

["ERROR_UPLOAD_FILE_TOO_BIG_POST_MAX_SIZE", "Файл кажется слишком большим"]

Размер файла, который я пытаюсь загрузить, составляет 592 байта! Максимальный общий лимит в одном запросе составляет 2Mo. А post_max_size в php.ini - «8M», тот же результат после того, как я изменил его на «0» (без ограничений). Затем установите 20 МБ, чтобы соответствовать upload_max_filesize (/etc/php/7.2/apache2/php.ini).
upload_max_filesize _ .. тоже "20M"

0
Bo. Ga. 27 Ноя 2018 в 20:15

1 ответ

Лучший ответ

Если кто-то нашел этот пост и нуждался в помощи, вот как мне удалось добиться успеха:
После отдельного создания «токена сеанса» и использования «RestSharp».

// Upload

var RSClient = new RestClient(Properties.Settings.Default.GLPI_URL);

var request = new RestRequest("Document", Method.POST);
request.AddHeader("Session-Token", Properties.Settings.Default.GLPI_SESSION_TOKEN);
request.AddHeader("App-Token", Properties.Settings.Default.GLPI_APP_TOKEN);
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "multipart/form-data");
request.AddQueryParameter("uploadManifest", "{\"input\": {\"name\": \"UploadFileTest\", \"_filename\": \"GiletsJaunes.jpg\"}}");
request.AddFile("test", @"C:\path\to\File.jpg");

IRestResponse response = RSClient.Execute(request);
var content = response.Content;

textBox2.Text = textBox2.Text + Environment.NewLine + content;

Подробности :

  • Я не мог использовать RestSharp.Authenticator = new SimpleAuthenticator по некоторым причинам, поэтому я добавил эти параметры аутентификации с помощью AddHeader.
  • Я не мог использовать сериализованную строку Json в new StringContent из-за AddQueryParameter, поэтому я написал ее вручную.

Аллилуйя.

1
Bo. Ga. 1 Дек 2018 в 20:34