HttpWebRequest Post запрос с разделителем и файлом - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Пересмотрел кучу примеров в интернете, но так и не могу понять как написать код. Обычные POST делаю без проблем. В общем запрос заголовки запроса выглядят так:
URL: http://localhost/files/add HOST: "localhost" User-Agent: "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0" Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" Accept-Language: "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3" Accept-Encoding: "gzip, deflate" Referer: "http://localhost/docs" Cookie: "blablabla" DNT: "1" Connection: "keep-alive" Upgrade-Insecure-Requests: "1"
Все понятно, кроме параметров DNT и Upgrade-Insecure-Requests: "1". Как понимаю надо просто добавить хедер с такой записью? А дальше параметры:
Content-Type: multipart/form-data; boundary=---------------------------181162868218259 Content-Length: 525 -----------------------------181162868218259 Content-Disposition: form-data; name="FILE"; filename="test.txt" Content-Type: text/plain text in file//передаваемые данные -----------------------------181162868218259 Content-Disposition: form-data; name="PFTYPPE_ID" 3//константа -----------------------------181162868218259 Content-Disposition: form-data; name="DESCRIPTION" descriptionText//описание добавляемого файла -----------------------------181162868218259 Content-Disposition: form-data; name="DOC_ID" 12345//номер документа -----------------------------181162868218259--
С boundary понятно. В начале параметров прописано что длина контента равна 525 байт, хотя по факту в параметрах 607 байт. Каким образом вычислить Content-Type: text/plain? Т.е. если я закидываю картинку, то тип контента автоматически меняется. Данные буду брать типа LONGBLOB из MySQL. Помогите, пожалуйста. Чувствую что делается элементарно, но уже запутался окончательно. В описываемых в Интернете примерах данные между разделителями отправляются отдельно, а тут получается что надо сначала сформировать параметры, а потом отправить.
как оказалось с boundary не понятно. Конкретно непонятно как он формируется. пробовал два варианта:
Листинг программы
  1. var boundary = new string('-', 27) + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
  2. var boundary2 = new string('-', 27) + DateTime.Now.Ticks.ToString();
оба выдают значения, сильно отличающиеся от boundary, которые генерирует веб-приложение. Вот параметры, передаваемые пост-запросом, который формируется при заполнении формы в браузере:
Листинг программы
  1. ontent-Type: multipart/form-data; boundary=---------------------------31292891730670
  2. Content-Length: 508
  3. -----------------------------31292891730670
  4. Content-Disposition: form-data; name="FILE"; filename="test.txt"
  5. Content-Type: text/plain
  6. text in file
  7. -----------------------------31292891730670
  8. Content-Disposition: form-data; name="PFTYPPE_ID"
  9. 3
  10. -----------------------------31292891730670
  11. Content-Disposition: form-data; name="DESCRIPTION"
  12. 111
  13. -----------------------------31292891730670
  14. Content-Disposition: form-data; name="DOC_ID"
  15. 1049916
  16. -----------------------------31292891730670--
Я формирую параметры так:
Листинг программы
  1. byte[] file = (byte[])reader[2];
  2. StringBuilder sb = new StringBuilder();
  3. sb.AppendLine(boundary2);
  4. sb.AppendLine("Content-Disposition: form-data; name="FILE"; filename="" + reader[1].ToString() + """);
  5. sb.AppendLine("Content-Type: " + getMimeFromFile(file));
  6. sb.AppendLine("");
  7. byte[] nachalo = Encoding.ASCII.GetBytes(sb.ToString());
  8. boundary = "--" + boundary2;
  9. StringBuilder sb2 = new StringBuilder();
  10. sb2.AppendLine(boundary);
  11. sb2.AppendLine("Content-Disposition: form-data; name="PFTYPPE_ID"");
  12. sb2.AppendLine("3");
  13. sb2.AppendLine(boundary);
  14. sb2.AppendLine("Content-Disposition: form-data; name="DESCRIPTION"");
  15. sb2.AppendLine("1 ");
  16. sb2.AppendLine(boundary);
  17. sb2.AppendLine("Content-Disposition: form-data; name="DOC_ID"");
  18. sb2.AppendLine(Number);
  19. sb2.AppendLine(boundary + "--");
  20. byte[] konec = Encoding.ASCII.GetBytes(sb2.ToString());
  21. byte[] res = nachalo.Concat(file).Concat(konec).ToArray();
В ответ сервер мне выдает что не заданы параметры для файла.
Сделал для теста изменение и отправку файла через браузер, изменил boundary и в ответ получаю все тот же ответ что не заданы все параметры для файла. Когда файл передается, то при корректном ответе возвращается JSON такого вида:
Листинг программы
  1. {"success":true,"result":{"DOC_ID":1049902,"FKEY":"1e563586f1a4f010e9bd583e1e4becc1aea98e7857e91a49b947e6.01081115","ID":null}}
Что это может быть за ключ? Может надо чтобы boundary формировался на стороне сервера?

Решение задачи: «HttpWebRequest Post запрос с разделителем и файлом»

textual
Листинг программы
  1. NameValueCollection parameters = new NameValueCollection();
  2. parameters.Add("PFTYPPE_ID", "3");
  3. parameters.Add("DESCRIPTION", " ");
  4. parameters.Add("DOC_ID", Number);
  5. string fullPath = Path.GetFullPath(reader[3].ToString());
  6. string MIME = GetMimeType(reader[2].ToString());
  7. HttpUploadFile("http://url", fullPath, "FILE", MIME , parameters);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.462 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут