Публикация многочастной формы данных - PullRequest
1 голос
/ 10 июля 2019

Я использую HttpWebRequest для отправки в MMS API.Тело сообщения содержит XML-данные о доставке и MMS-сообщение в виде многокомпонентного вложения MIME, которое должно быть закодировано в Base64.

Сообщение успешно, но я получаю только текст, а не изображение.

Когда я смотрю на мой код, кажется, что данные формы построены нормально, но когда я преобразовываю их обратно в строку, данные файла отсутствуют.

СОДЕРЖАНИЕ str VARIABLE:

------------ f2de17263b724d5a919b14a6834c489f Расположение содержимого: форма-данные;name = "username"

трилогия ------------ f2de17263b724d5a919b14a6834c489f Content-Disposition: form-data;name = "пароль"

ZBo8KE6m ------------ f2de17263b724d5a919b14a6834c489f Content-Disposition: form-data;name = "number"

61402720898 ------------ f2de17263b724d5a919b14a6834c489f Content-Disposition: form-data;name = "subject"

Тема тестового сообщения

------------ f2de17263b724d5a919b14a6834c489f Расположение содержимого: form-data;name = "message"

Тело тестового сообщения.

------------ f2de17263b724d5a919b14a6834c489f Content-Disposition: form-data;name = "type0"

image / jpeg ------------ f2de17263b724d5a919b14a6834c489f Content-Disposition: form-data;name = "type1"

image / jpeg ------------ f2de17263b724d5a919b14a6834c489f Content-Disposition: form-data;name = "name0"

Voucher.png ------------ f2de17263b724d5a919b14a6834c489f Content-Disposition: form-data;name = "name1"

QRCode.png ------------ f2de17263b724d5a919b14a6834c489f Content-Disposition: form-data;Name = "attachment0";filename = "Voucher.png" Тип содержимого: image / jpeg

�PNG

    private static readonly Encoding encoding = Encoding.UTF8;
    public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, Dictionary<string, object> postParameters)
    {
        string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());
        string contentType = "multipart/form-data; boundary=" + formDataBoundary;

        byte[] formData = GetMultipartFormData(postParameters, formDataBoundary);
        var str = Encoding.UTF8.GetString(formData);

        return PostForm(postUrl, userAgent, contentType, formData);
    }

    private static byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)
    {
        Stream formDataStream = new System.IO.MemoryStream();
        byte[] formData = new byte[0];
        bool needsCLRF = false;
        try
        {
            foreach (var param in postParameters)
            {
                // add a CRLF to allow multiple parameters to be added (skip it on the 1st parameter)
                if (needsCLRF)
                    formDataStream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n"));

                needsCLRF = true;

                if (param.Value is FileParameter)
                {
                    FileParameter fileToUpload = (FileParameter)param.Value;

                    // add just the first part of this param, since we will write the file data directly to the stream
                    string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n",
                        boundary,
                        param.Key,
                        fileToUpload.FileName ?? param.Key,
                        fileToUpload.ContentType ?? "application/octet-stream");

                    formDataStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header));

                    // write the file to the stream
                    string str = Convert.ToBase64String(fileToUpload.File);
                    byte[] myBytes = Convert.FromBase64String(str);
                    formDataStream.Write(myBytes, 0, myBytes.Length);
                                        }
                else
                {
                    string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",
                        boundary,
                        param.Key,
                        param.Value);
                    formDataStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData));
                }
            }

            // add the end of the request. Start with a newline
            string footer = "\r\n--" + boundary + "--\r\n";
            formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer));

            // dump stream into byte array
            formDataStream.Position = 0;
            formData = new byte[formDataStream.Length];
            formDataStream.Read(formData, 0, formData.Length);
            formDataStream.Close();
        }
        catch (Exception ex)
        {
            gFunc.ProcessError(true, ex.ToString(), "Post Data");
        }
        return formData;
    }

1 Ответ

0 голосов
/ 10 июля 2019

Оказывается, что проблема была с данными поста.

После удаления дополнительных полей в «Content-Distribution» для параметра File это сработало.

ПРЕДЫДУЩАЯ: Контент-Расположение: форма-данные;Name = "attachment0";filename = "Voucher.png" Content-Type: image / jpeg

NOW: Content-Disposition: form-data;Name = "attachment0"

...