Я пытаюсь загрузить файл и отправить по нескольким параметрам на мой сайт с помощью .NET/С#. Прочитав несколько руководств, которые выполняют либо несколько параметров, либо файл, я попытался, безуспешно, объединить их. Вот как я это делаю:
WebRequest req = WebRequest.Create(baseURL + "upload");
req.Credentials = new NetworkCredential(username, password);
String boundary = "B0unD-Ary";
req.ContentType = "multipart/form-data; boundary=" + boundary;
req.Method = "POST";
((HttpWebRequest)req).UserAgent = "UploadTester v0.1";
string postData = "--" + boundary + "\nContent-Disposition: form-data\n";
postData += "myId=123&someFk=456";
postData += "\n--" + boundary + "\nContent-Disposition: form-data; name=\"file\" filename=\"upload.pdf\" Content-Type: application/pdf\n\n";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
byte[] filedata = null;
using (BinaryReader reader = new BinaryReader(File.OpenRead("myfile.pdf")))
filedata = reader.ReadBytes((int)reader.BaseStream.Length);
req.ContentLength = byteArray.Length + filedata.Length;
req.GetRequestStream().Write(byteArray, 0, byteArray.Length);
req.GetRequestStream().Write(filedata, 0, filedata.Length);
WebResponse response = req.GetResponse();
Stream data = response.GetResponseStream();
StreamReader sReader = new StreamReader(data);
String sResponse = sReader.ReadToEnd();
response.Close();
Когда я его выполняю, я получаю исключение 500, говоря: "Раздел заголовка имеет более 10240 битнов (может быть, он не был надлежащим образом завершен)", и Wireshark сообщает мне, что отправленный запрос был неправильным пакетом, где MIME multipart был уродливы.
Здесь, вероятно, есть несколько вопросов, поэтому, пожалуйста, дайте мне знать все проблемы, которые вы можете обнаружить.
Обновить: чтобы отделить MIME от С#/. NET, я создал здесь поток: https://stackoverflow.com/info/1880002/error-in-mime-packet-for-http-post
Обновление 2. Таким образом, у бэкэнда действительно есть проблемы с длиной содержимого, говоря, что количество байтов, доступных для чтения, меньше заданной длины контента. НО! Если я уменьшу длину содержимого в req.ContentLength соответственно, у меня нет размера буфера, достаточно большого для отправки данных. Любые предложения?
Обновление 3. На самом деле, похоже, что заголовок имеет слишком большой размер по сравнению с тем, сколько данных он содержит.