Как я могу загрузить данные и файл в одном сообщении? - PullRequest
1 голос
/ 25 ноября 2010

Мне нужно загрузить файл PDF и номер телефона в службу, которая отправит факс.

Форма, которая работает (с веб-страницы) выглядит следующим образом:

<form action="send.php" method="post" enctype="multipart/form-data"> 
    <input type="file" name="pdf" id="pdf" /> 
    <input type="text" name="phonenumber" id="phonenumber" /> 
    <input type="submit" name="Submit" /> 
</form> 

Проблема в том, что мне нужно сделать это из приложения Windows, написанного на C #.

Как я могу загрузить файл и строку в одном сообщении?

Я использую класс WebClient.
Я попытался открыть файл, прочитать его байты и выложить все это так:

string content = "phonenumber="+request.PhoneNumber+"&pdf=";

WebClient c = new WebClient();
c.Headers.Add("Content-Type", "multipart/form-data");
c.Headers.Add("Cache-Control", "no-cache");
c.Headers.Add("Pragma", "no-cache");

byte[] bret = null;
byte[] p1 = Encoding.ASCII.GetBytes(content);
byte[] p2 = null;
using (StreamReader sr = new StreamReader(request.PdfPath))
{
    using (BinaryReader br = new BinaryReader(sr.BaseStream))
    {
        p2 = br.ReadBytes((int)sr.BaseStream.Length);
    }
}

byte[] all = new byte[p1.Length + p2.Length];
Array.Copy(p1, 0, all, 0, p1.Length);
Array.Copy(p2, 0, all, p1.Length, p2.Length);

bret = c.UploadData(url, "POST", all);

Это не работает.

У меня нет журналов сервера или чего-либо подобного, чтобы помочь мне отладить его.

Я что-то упускаю из класса WebClient? Есть ли другой способ объединить UploadFile и UploadData для публикации обоих значений, как на веб-странице (которая работает)?

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

Прежде всего, у вас есть опечатка при выполнении c.Headers.Add в заголовке multipart / form-data.: -)

Во-вторых, вам нужно правильно отформатировать сообщение, введя границы между частями контента.Взгляните здесь .

2 голосов
/ 25 ноября 2010

Вы должны разделить загруженные данные с использованием границ.См. сообщение для деталей.

0 голосов
/ 25 ноября 2010

Это может или не может помочь, но я замечаю опечатку:

c.Headers.Add("Content-Type", "multipart/form-dat");

должно быть

c.Headers.Add("Content-Type", "multipart/form-data");
...