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 не понятно. Конкретно непонятно как он формируется. пробовал два варианта:
var boundary = new string('-', 27) + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
var boundary2 = new string('-', 27) + DateTime.Now.Ticks.ToString();
оба выдают значения, сильно отличающиеся от boundary, которые генерирует веб-приложение. Вот параметры, передаваемые пост-запросом, который формируется при заполнении формы в браузере:
ontent-Type: multipart/form-data; boundary=---------------------------31292891730670
Content-Length: 508
 
-----------------------------31292891730670
Content-Disposition: form-data; name="FILE"; filename="test.txt"
Content-Type: text/plain
 
text in file
-----------------------------31292891730670
Content-Disposition: form-data; name="PFTYPPE_ID"
 
3
-----------------------------31292891730670
Content-Disposition: form-data; name="DESCRIPTION"
 
111
-----------------------------31292891730670
Content-Disposition: form-data; name="DOC_ID"
 
1049916
-----------------------------31292891730670--
Я формирую параметры так:
byte[] file = (byte[])reader[2];
StringBuilder sb = new StringBuilder();
sb.AppendLine(boundary2);
sb.AppendLine("Content-Disposition: form-data; name="FILE"; filename="" + reader[1].ToString() + """);
sb.AppendLine("Content-Type: " + getMimeFromFile(file));
sb.AppendLine("");
byte[] nachalo = Encoding.ASCII.GetBytes(sb.ToString());
boundary = "--" + boundary2;
StringBuilder sb2 = new StringBuilder();
sb2.AppendLine(boundary);
sb2.AppendLine("Content-Disposition: form-data; name="PFTYPPE_ID"");
sb2.AppendLine("3");
sb2.AppendLine(boundary);
sb2.AppendLine("Content-Disposition: form-data; name="DESCRIPTION"");
sb2.AppendLine("1 ");
sb2.AppendLine(boundary);
sb2.AppendLine("Content-Disposition: form-data; name="DOC_ID"");
sb2.AppendLine(Number);
sb2.AppendLine(boundary + "--");                            
byte[] konec = Encoding.ASCII.GetBytes(sb2.ToString());
byte[] res = nachalo.Concat(file).Concat(konec).ToArray();
В ответ сервер мне выдает что не заданы параметры для файла.
Сделал для теста изменение и отправку файла через браузер, изменил boundary и в ответ получаю все тот же ответ что не заданы все параметры для файла. Когда файл передается, то при корректном ответе возвращается JSON такого вида:
{"success":true,"result":{"DOC_ID":1049902,"FKEY":"1e563586f1a4f010e9bd583e1e4becc1aea98e7857e91a49b947e6.01081115","ID":null}}
Что это может быть за ключ? Может надо чтобы boundary формировался на стороне сервера?

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

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

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


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

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

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