Tuesday, May 15, 2012

Uploading ImageFile on Remote Server with Windows Phone7 




Helper class file


using System;

using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Windows.Threading;
using System.Collections.Generic;

namespace FileUploadExample
{
    public class SendFile
    {
public string url { get; set; }
public string fileName = null;
public Dictionary<string, object> parameters { get; set; }
string boundary = "----------" + DateTime.Now.Ticks.ToString();

public SendFile() { }

public void Submit()
{
   // Prepare web request...
   HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(new Uri(url));
   myRequest.Method = "POST";
   myRequest.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
   myRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), myRequest);
}
private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
   HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
   Stream postStream = request.EndGetRequestStream(asynchronousResult);

   writeMultipartObject(postStream, parameters);
   postStream.Close();

   request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}

private void GetResponseCallback(IAsyncResult asynchronousResult)
{
   try
   {
var request = (HttpWebRequest)asynchronousResult.AsyncState;
var response = request.EndGetResponse(asynchronousResult);

using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
   // FAIL - httpWebRequestTextBlock.Text = reader.ReadToEnd(); //UnauthorizedAccessException was Unhandled - Invalid cross-thread access.

   // FAIL - Dispatcher.BeginInvoke(() => { httpWebRequestTextBlock.Text = reader.ReadToEnd(); }); //ObjectDisposedException unhandled - Cannot read from a closed TextReader.

   var contents = reader.ReadToEnd();
   Deployment.Current.Dispatcher.BeginInvoke(() => { MessageBox.Show(contents); });
}
   }
   catch (System.Net.WebException)
   {
Deployment.Current.Dispatcher.BeginInvoke(() => { MessageBox.Show("Time out Occur. Please try again"); });
   }
}
public void writeMultipartObject(Stream stream, object data)
{
   StreamWriter writer = new StreamWriter(stream);
   if (data != null)
   {
foreach (var entry in data as Dictionary<string, object>)
{
   WriteEntry(writer, entry.Key, entry.Value);
}
   }
   writer.Write("--");
   writer.Write(boundary);
   writer.WriteLine("--");
   writer.Flush();
}

private void WriteEntry(StreamWriter writer, string key, object value)
{
   if (value != null)
   {
writer.Write("--");
writer.WriteLine(boundary);
if (value is byte[])
{
   byte[] ba = value as byte[];

writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""; filename=""{1}""", key, fileName);
   writer.WriteLine(@"Content-Type: application/octet-stream");
   //writer.WriteLine(@"Content-Type: image / jpeg");
   writer.WriteLine(@"Content-Length: " + ba.Length);
   writer.WriteLine();
   writer.Flush();
   Stream output = writer.BaseStream;

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


Code behind Logic

private void cmdGetImage_Click(object sender, RoutedEventArgs e)
{
   photo.ShowCamera = true;
   photo.Show();
   photo.Completed += new EventHandler<PhotoResult>(photo_Completed);
}

void photo_Completed(object sender, PhotoResult e)
{
    if (e.TaskResult == TaskResult.OK)
    {
byte[] byteArray = Setting.ReadToEnd(e.ChosenPhoto);
string filename = "file:" + e.OriginalFileName;
SendMessage(txtUsername.Text , txtMessage.Text, DateTime.Now.ToString(), "Text", byteArray filename);    
    }
else
MessageBox.Show("not found");
}

// Method to convert Stream in to byte[] Array
public static byte[] ReadToEnd(System.IO.Stream stream)
{
   long originalPosition = 0;

   if (stream.CanSeek)
   {
originalPosition = stream.Position;
stream.Position = 0;
   }

   try
   {
byte[] readBuffer = new byte[4096];
int totalBytesRead = 0;
int bytesRead;

while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
{
   totalBytesRead += bytesRead;

   if (totalBytesRead == readBuffer.Length)
   {
int nextByte = stream.ReadByte();
if (nextByte != -1)
{
   byte[] temp = new byte[readBuffer.Length * 2];
   Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
   Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
   readBuffer = temp;
   totalBytesRead++;
}
   }
}

private void SendMessage(string  _username , string _message, string _date, string _mode, byte[] fileArray ,  string filename)
{
Dictionary<string, object> data = new Dictionary<string, object>()
{
    {"username", _username},
    {"message", _message},
    {"date", _date},
    {"mode",_mode},
    {"file", fileArray}
};
string serverFileName = "image_" + DateTime.Now.ToFileTime() + filename.Substring(filename.LastIndexOf('.'), filename.Length - filename.LastIndexOf('.'));

// Call the constructor of above Helper file
SendFile post = new SendFile 
url = "Enter your webservice Url"
parameters = data,  
fileName = serverFileName 
};

 // Calling the post method of Helper file
post.Submit();

}



Happy Coding...

No comments:

Post a Comment

Total Pageviews