C # чтение изображения объекта в веб-запрос - PullRequest
0 голосов
/ 02 июня 2009

Эй, я сейчас пытаюсь отправить файл изображения на веб-сервер, используя веб-запрос, поток памяти и объект изображения.

Это мой текущий метод отправки запроса:

    public void Send(Image image)
    {
        //Assign the request here too, just in case
        Request = (HttpWebRequest)WebRequest.Create(FormURL);

        Request.Method = "POST";
        Request.ContentType = "multipart/form-data; boundary=" + CONTENT_BOUNDARY;
        Request.Headers.Add("Cache-Control", "no-cache");
        Request.KeepAlive = true;
        Request.ContentLength = GetFormElements().Length +
        GetFileHeader(FileName).Length +
        FILE_TRAIL.Length +
        ConvertImageToByteArray(image).Length;

        //Must be done in this order for stream to write properly:
        //----
        //Form elements
        //File header
        //Image
        //File trailer
        //----
        WriteStringToStream(FileStream, GetFormElements());
        WriteStringToStream(FileStream, GetFileHeader(FileName));
        WriteImageToStream(FileStream, image);
        WriteStringToStream(FileStream, FILE_TRAIL);

        string PostData = ASCIIEncoding.ASCII.GetString(ConvertImageToByteArray(image));

        StreamWriter SW = new StreamWriter(Request.GetRequestStream(), Encoding.ASCII);
        SW.Write(PostData);

        GetRequestResponse();
        Console.WriteLine(Request.HaveResponse);
        FileStream.Close();
        Request = null;

    }

Проблема, с которой я столкнулся, заключается в том, что я вообще не получаю ЛЮБОГО ответа от сервера, несмотря на то, что поток имеет правильную длину (я удалил некоторые отладочные выходные данные из кода выше)

При необходимости я могу опубликовать другие части моего класса, но сейчас здесь есть функции записи:

WriteStringToStream:

    private void WriteStringToStream(System.IO.MemoryStream stream, string String)
    {
        byte[] PostData = System.Text.Encoding.ASCII.GetBytes(String);
        stream.Write(PostData, 0, PostData.Length);
    }

WriteImageToSteam:

private void WriteImageToStream(System.IO.MemoryStream Stream, Image img)
{
    Stream.Write(ConvertImageToByteArray(img), 0, ConvertImageToByteArray(img).Length);
}

ConvertImageToByteArray:

    private Byte[] ConvertImageToByteArray(Image img)
    {
        //Method taken from http://www.csharp-station.com/Articles/Thumbnails.aspx and adapted
        MemoryStream memStream = new MemoryStream();
        img.Save(memStream, System.Drawing.Imaging.ImageFormat.Jpeg);

        byte[] byteArray = new Byte[memStream.Length];

        memStream.Position = 0;
        memStream.Read(byteArray, 0, (int)memStream.Length);
        return byteArray;
    }

Ответы [ 4 ]

3 голосов
/ 02 июня 2009

Вы должны закрыть ПО перед отправкой запроса.

Кроме того, вместо преобразования байтового массива в ASCII и последующей записи его в StreamWriter, вы должны записать байтовый массив непосредственно в поток запросов. (А затем закройте поток запросов перед отправкой запроса)

0 голосов
/ 02 июня 2009

Проблема решена :) Теперь у меня есть ответ - даже если это не то, что я ожидал ...

0 голосов
/ 02 июня 2009
        private void GetRequestResponse()
    {
        if (null == FileStream)
        {
            System.IO.Stream stream;
            WebResponse webResponse;
            try
            {
                webResponse = Request.GetResponse();
            }
            catch (WebException web)
            {
                webResponse = web.Response;
            }

            if (null != webResponse)
            {
                stream = webResponse.GetResponseStream();
                StreamReader sr = new StreamReader(stream);
                string str;
                Response = "";

                while ((str = sr.ReadLine()) != null)
                {
                    Response += str;
                }
                webResponse.Close();
            }
            else
            {
                throw new Exception("Error retrieving server response");
            }
        }
    }

В ответ на SLaks выше приведено содержимое GetRequestResponse. В этом классе Response - это просто строка.

0 голосов
/ 02 июня 2009

какова цель "FileStream"? Декларация не отображается, вы записываете данные, затем просто закрываете их. Вы хотели написать это в поток запросов и забыли? Похоже, вы считаете это в Request.ContentLength, но никогда не записываете его в запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...