Silverlight Http Post для загрузки изображений - PullRequest
1 голос
/ 01 октября 2010

Я пытался выполнить запрос HTTP Post для загрузки изображения в приложение silverlight для приложения Windows Phone 7.Примеры кодов онлайн не дают мне желаемого ответа от API.Может ли кто-нибудь предоставить рабочий код, который делает это?

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

Заранее спасибо!

Вот мой код:

 private void post_image(version, username,password,job-id, serviceUri)
    {
        if (session_free.bLoggedIn)
        {                
            bool submit_success = false;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(serviceUri));

            IsolatedStorageFileStream stream = IsolatedStorageFile.GetUserStoreForApplication().OpenFile("file.jpg", FileMode.Open);

            request.PostMultiPartAsync(new Dictionary<string, object> { { "version", version }, { "username", user }, { "password", pass }, { filename, stream } }, new AsyncCallback(asyncResult =>
            {

                Thread.Sleep(1000);

                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                Post_Result = reader.ReadToEnd();

                this.Dispatcher.BeginInvoke(delegate
                {
                   MessageBox.Show(Post_Result);
                    response.Close();
                });
            }), filename);

            Thread.Sleep(1000);
        }

        else
        {
            MessageBox.Show("User not signed in! Please login to continue...", "Invalid Authentication", MessageBoxButton.OK);
        }
    }

    public class DataContractMultiPartSerializer
{
    private string boundary;

    public DataContractMultiPartSerializer(string boundary)
    {
        this.boundary = boundary;
    }

    private void WriteEntry(StreamWriter writer, string key, object value, string filename)
    {

        if (value != null)
        {
            writer.Write("--");
            writer.WriteLine(boundary);
            if (value is IsolatedStorageFileStream)
            {
                IsolatedStorageFileStream f = value as IsolatedStorageFileStream;
                writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""; filename=""{1}""", key, filename);
                writer.WriteLine("Content-Type: image/jpeg");
                writer.WriteLine("Content-Length: " + f.Length);
                writer.WriteLine();
                writer.Flush();
                Stream output = writer.BaseStream;
                Stream input = f;
                byte[] buffer = new byte[4096];
                for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length))
                {
                    output.Write(buffer, 0, size);
                }
                output.Flush();
                writer.WriteLine();
            }

            else
            {
                writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""", key);
                writer.WriteLine();
                writer.WriteLine(value.ToString());
            }
        }
    }

    public void WriteObject(Stream stream, object data, string filename)
    {
        StreamWriter writer = new StreamWriter(stream);
        if (data != null)
        {


            if (data is Dictionary<string, object>)
            {
                foreach (var entry in data as Dictionary<string, object>)
                {
                    WriteEntry(writer, entry.Key, entry.Value, filename);
                }
            }

            else
            {
                foreach (var prop in data.GetType().GetFields())
                {
                    foreach (var attribute in prop.GetCustomAttributes(true))
                    {
                        if (attribute is System.Runtime.Serialization.DataMemberAttribute)
                        {
                            DataMemberAttribute member = attribute as DataMemberAttribute;
                            writer.Write("{0}={1}&", member.Name ?? prop.Name, prop.GetValue(data));
                        }
                    }
                }
            }
            writer.Flush();
        }
    }
}

1 Ответ

6 голосов
/ 01 октября 2010

Существует ли причина, по которой вы используете составное сообщение?
Какой метод PostMultiPartAsync вы используете?Предположительно, это где-то метод расширения?
В будущем попробуйте предоставить наименьший полный код, который демонстрирует проблему.

В любом случае, извините, это не полный рабочий пример, но вотшаги для одного способа сделать это.

Создайте запрос и установите обратный вызов для BeginGetRequestStream

var request = (HttpWebRequest)WebRequest.Create(App.Config.ServerUris.Login);

request.Method = "POST";
request.BeginGetRequestStream(ReadCallback, request);

В этом обратном вызове получите поток запроса и запишите свои данные в него.*

using (var postStream = request.EndGetRequestStream(asynchronousResult))
{
    // Serialize image to byte array, or similar (that's what imageBuffer is)
    postStream.Write(imageBuffer, 0, imageBuffer.Length);
}

Установите обратный вызов для ответа от сервера.

request.BeginGetResponse(ResponseCallback, request);

Убедитесь, что на сервере все работает нормально

private void ResponseCallback(IAsyncResult asynchronousResult)
{
    var request = (HttpWebRequest)asynchronousResult.AsyncState;

    using (var resp = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
    {
        using (var streamResponse = resp.GetResponseStream())
        {
            using (var streamRead = new StreamReader(streamResponse))
            {
                string responseString = streamRead.ReadToEnd();  // Assuming that the server will send a text based indication of upload success

                // act on the response as appropriate
            }
        }
    }
}

На сервере вам потребуетсядесериализовать данные и при необходимости превратить их в изображение.

HTH.

...