Monday, September 6, 2010

Writting a file throught Silverlight .

The following code sipnet shows how we can open a file dialog from
the Silverlight Applcation and write to the server .
This is done via in conjection with the Asp.net handlers.


 private void FileUpLoader()
      {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Multiselect = false;
        bool? retVal = openFileDialog.ShowDialog();

        if (retVal != null && retVal == true)
          {
            UploadFile(openFileDialog.File.Name,openFileDialog.File.OpenRead());
            tblStatus.Text = openFileDialog.File.Name;
          }
        else
          {
             tblStatus.Text = "Please select a file";
          }
       }




 private void UploadFile(string fileName, Stream data)
        {
            UriBuilder uriBuilder =
             new UriBuilder("http://localhost/SLMemoryLeakSample.Web/FileUploader.ashx");
            uriBuilder.Query = string.Format("filename={0}", fileName);

            WebClient webClient = new WebClient();
            webClient.OpenWriteCompleted += (sender, e) =>
            {
                WriteStream(data, e.Result);
                e.Result.Close();
                data.Close();
            };
            webClient.OpenWriteAsync(uriBuilder.Uri);
        }



 private void WriteStream(Stream input, Stream output)
        {

            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0)
            {
                output.Write(buffer, 0, bytesRead);
            }
        }


The FileUploader.ashx will be as following


 public class FileUploader : IHttpHandler
    {

        #region FileUploader
        public void ProcessRequest(HttpContext context)
        {
            string filename = context.Request.QueryString["filename"].ToString();

            using (FileStream fs = File.Create(context.Server.MapPath("~/App_Data/" + filename)))
            {
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = context.Request.InputStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    fs.Write(buffer, 0, bytesRead);
                }
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        } 
        #endregion
    }

Enjoy Coding ............................................

0 comments:

Post a Comment