HttpWebRequest Post запрос с разделителем и файлом - C#
Формулировка задачи:
Добрый день! Пересмотрел кучу примеров в интернете, но так и не могу понять как написать код. Обычные POST делаю без проблем.
В общем запрос заголовки запроса выглядят так:
Все понятно, кроме параметров DNT и Upgrade-Insecure-Requests: "1". Как понимаю надо просто добавить хедер с такой записью?
А дальше параметры:
С boundary понятно. В начале параметров прописано что длина контента равна 525 байт, хотя по факту в параметрах 607 байт. Каким образом вычислить Content-Type: text/plain? Т.е. если я закидываю картинку, то тип контента автоматически меняется. Данные буду брать типа LONGBLOB из MySQL.
Помогите, пожалуйста. Чувствую что делается элементарно, но уже запутался окончательно. В описываемых в Интернете примерах данные между разделителями отправляются отдельно, а тут получается что надо сначала сформировать параметры, а потом отправить.
оба выдают значения, сильно отличающиеся от boundary, которые генерирует веб-приложение.
Вот параметры, передаваемые пост-запросом, который формируется при заполнении формы в браузере:
Я формирую параметры так:
В ответ сервер мне выдает что не заданы параметры для файла.
Что это может быть за ключ? Может надо чтобы boundary формировался на стороне сервера?
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"
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 не понятно. Конкретно непонятно как он формируется.
пробовал два варианта:
var boundary = new string('-', 27) + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo); var boundary2 = new string('-', 27) + DateTime.Now.Ticks.ToString();
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}}
Решение задачи: «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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д