Async file upload with jquery and ASP.NET

Recently before some I was in search of good asynchronous file upload control which can upload file without post back and I have don’t have to write  much custom logic about this. So after searching it on internet I have found lots of options but some of the options were not working with ASP.NET and some of work options are not possible regarding context to my application just like AsyncFileUpload from Ajax toolkit.As in my application we were having old version of Ajax toolkit and if we change it than other controls stopped working. So after doing further search on internet I have found a great Juqery plugin which can easily be integrated with my application and I don’t have to write much coding to do same.

So I have download that plug from the following link. This plug in created by yvind Saltvik,

http://www.phpletter.com/Our-Projects/AjaxFileUpload/

After downloading the plugin and going through it documentation I have found that I need to write a page or generic handler which can directly upload the file on the server. So I have decided to write a generic handler for that as generic handler is best suited with this kind of situation and we don’t have to bother about response generated by it.

So let’s create example and In this example I will show how we can create async file upload without writing so much code with the help of this plugin. So I have create project called JuqeryFileUpload and our need for this example to create a generic handler. So let’s create a generic handler. You can create a new generic handler via right project-> Add –>New item->Generic handler just like following.

GenericHandlerForJqueryFileUploadwithASPNET

I have created generic handler called AjaxFileuploader and following is simple code for that.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;

namespace JuqeryFileUPload
{
    /// <summary>
    /// Summary description for AjaxFileUploader
    /// </summary>
    public class AjaxFileUploader : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            if (context.Request.Files.Count > 0)
            {
                string path = context.Server.MapPath("~/Temp");
                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);

                var file = context.Request.Files[0];

                string fileName;

                if (HttpContext.Current.Request.Browser.Browser.ToUpper() == "IE")
                {
                    string[] files = file.FileName.Split(new char[] { '\\' });
                    fileName = files[files.Length - 1];
                }
                else
                {
                    fileName = file.FileName;
                }
                string strFileName=fileName ;
                fileName = Path.Combine(path, fileName);
                file.SaveAs(fileName);

                
                string msg = "{";
                msg += string.Format("error:'{0}',\n", string.Empty);
                msg += string.Format("msg:'{0}'\n", strFileName);
                msg += "}";
                context.Response.Write(msg);  

                
            }
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}

As you can see in above code.I have written a simple code to upload a file from received from file upload plugin into the temp directory on the server and if this directory is not there on the server then it will also get created by the this generic handler.At the end of the of execution I am returning the simple response which is required by plugin itself. Here in message part I am passing the name of file uploaded and in error message you can pass error if anything occurred for the time being I have not used right now.

As like all jQuery plugin this plugin also does need jQuery file and there is another .js file given for plugin called ajaxfileupload.js. So I have created a test.aspx to test jQuery file and written following html for that .

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="JuqeryFileUPload.Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="ajaxfileupload.js"></script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
          <input id="fileToUpload" type="file" size="45" name="fileToUpload" class="input">
          <button id="buttonUpload" onclick="return ajaxFileUpload();">Upload</button>
          <img id="loading" src="loading.gif" style="display:none;">
    </div>
    </form>
</body>
</html>

As you can see in above code there its very simple. I have included the jQuery and ajafileupload.js given by the file upload give and there are three elements that I have used one if plain file input control you can also use the asp.net file upload control and but here I don’t need it so I have user file upload control. There is button there called which is calling a JavaScript function called “ajaxFileUpload” and here we will write a code upload that. There is an image called loading which just an animated gif which will display during the async call of generic handler. Following is code ajaxFileUpload function.

<script type="text/javascript">
    function ajaxFileUpload() {
        $("#loading")
    .ajaxStart(function () {
        $(this).show();
    })
    .ajaxComplete(function () {
        $(this).hide();
    });

    $.ajaxFileUpload
    (
        {
            url: 'AjaxFileUploader.ashx',
            secureuri: false,
            fileElementId: 'fileToUpload',
            dataType: 'json',
            data: { name: 'logan', id: 'id' },
            success: function (data, status) {
                if (typeof (data.error) != 'undefined') {
                    if (data.error != '') {
                        alert(data.error);
                    } else {
                        alert(data.msg);
                    }
                }
            },
            error: function (data, status, e) {
                alert(e);
            }
        }
    )

        return false;

    }
</script>

As you can see in above code I have putted our generic handler url which will upload the file on server as url parameter. There is also parameter called secureURI is required to be true if you are uploading file through the secure channel and as a third parameter we have to pass a file upload control id which I have already passed and in fourth parameter we have to passed busy indicator which I have also passed. Once we passed all the parameter then it will call a method for plugin and will return response in terms of message and error. So There is two handler function written for that.

That’s it. Our async file upload is ready. As you can easily integrate it and also it working fine in all the browser. Hope you like it. Stay tuned for more. Till then happy programming..

Shout it
Published Friday, December 23, 2011 1:32 AM by Jalpesh P. Vadgama
Filed under: , ,

Comments

# re: Async file upload with jquery and ASP.NET

Friday, December 23, 2011 4:46 AM by bestcomy

replace

if (HttpContext.Current.Request.Browser.Browser.ToUpper() == "IE")                {                    string[] files = file.FileName.Split(new char[] { '\\' });                    fileName = files[files.Length - 1];                }                else                {                    fileName = file.FileName;                }

as

fileName=System.IO.Path.GetFileName(file.FileName)

# re: Async file upload with jquery and ASP.NET

Friday, December 23, 2011 12:30 PM by SGWellens

Nice post.  But this sentence doesn't look right: ...I have putted our generic handler...

You can delete this post after you read it.

# re: Async file upload with jquery and ASP.NET

Friday, December 23, 2011 3:53 PM by Jalpesh P. Vadgama

@bestcomy- Thanks for your suggestion but this work when you have that file on server side. I am getting whole file in stream not on the serve side.

@SGWellens- I have corrected that.

# re: Async file upload with jquery and ASP.NET

Monday, December 26, 2011 8:51 AM by Jr

Nice post, It helped me a lot =0) Have good holiday!

# re: Async file upload with jquery and ASP.NET

Thursday, January 12, 2012 12:49 AM by Ddub

Nice approach, but I'm getting an error when I invoke the button.

"Microsoft JScript runtime error: Object doesn't support property or method 'ajaxFileUpload'"

I've included all of the files, but it isn't seeing the extension. Any thoughts?

# re: Async file upload with jquery and ASP.NET

Friday, January 13, 2012 1:27 AM by Jalpesh P. Vadgama

@Dub- It seems that you have included ajaxfileupload.js because its not able to find ajaxfileupload method.

Have you downloaded it from the URL of extension I specified in blog.

Send me your code if you have still same problem.Also which version of jquery you using? Please specify.

Regards,

Jalpesh

# re: Async file upload with jquery and ASP.NET

Thursday, February 23, 2012 5:21 AM by Jalpesh P. Vadgama

@amila- Can you sendme code for that.

# re: Async file upload with jquery and ASP.NET

Thursday, April 12, 2012 1:33 PM by nkadih

The file received ok but the json data are not. form.allkeys count is zero.

why

# re: Async file upload with jquery and ASP.NET

Thursday, April 12, 2012 2:11 PM by Jalpesh P. Vadgama

@nkadih- What's the code you have written in your handler?

# re: Async file upload with jquery and ASP.NET

Wednesday, July 11, 2012 5:32 AM by suresh

Am getting two alert message that is "object object" and "undefined" but file is getting upload in server. why am getting there alert message?

# re: Async file upload with jquery and ASP.NET

Wednesday, July 18, 2012 9:32 AM by Jalpesh P. Vadgama

@suresh - can you send me the code here.