1

I have this function which does the actual file download (in a controller called AzureTest); its a MVC project:

private bool DownloadKit()
      {
         bool bReturn, bSuccess = false;

         CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("ConnString");
         CloudBlobClient cbcClient = account.CreateCloudBlobClient();
         BlobRequestOptions options = new BlobRequestOptions();
         options.UseFlatBlobListing = true;

         CloudBlobContainer cbcFiles = new CloudBlobContainer("files", cbcClient);

         CloudBlob cbKit = cbcFiles.GetBlobReference("Kit.exe");

         ControllerContext.HttpContext.Response.Clear();
         ControllerContext.HttpContext.Response.ContentType = "application/octet-stream";
         ControllerContext.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=Kit.exe");

         MemoryStream msFile = new MemoryStream();
         cbKit.DownloadToStream(msFile);
         msFile.Position = 0;
         ControllerContext.HttpContext.Response.OutputStream.Write(msFile.ToArray(), 0, msFile.ToArray().Length);
         ControllerContext.HttpContext.Response.Flush();

         bReturn = bSuccess;
         return bReturn;
      }

This is called by the following function:

[HttpPost]
  public JsonResult Download()
  {
     try
     {
        bool bDlKit = DownloadKit();
     }
     catch (Exception ex)
     {
        //ToDo
     }

     return Json(null);
  }

Now the cshtml file has the following javascript code:

 $("#btnGetKit").click(function () {
    $("#btnGetKit").hide();
    $.ajax({
                url: "AzureTest/Download",
                type: "POST",
                success: function () {
                     $("#btnGetKit").show();
                     }
        })
    }

Here is the problem: When I call DownloadKit() right at the page load, then everything work and I get prompted to download the file. When I use the ajax mechanism, even though the code works fine, there is no prompt to download the file. Its as if the OutputStream is not being written to.

I will really appreciate someone giving some pointers. I am new to MVC, so still finding my way around.

tereško
  • 58,060
  • 25
  • 98
  • 150
Manas
  • 521
  • 8
  • 26

1 Answers1

0

I don't think it's possible. Based on this thread: Download a file by jQuery.Ajax, JavaScript cannot save files directly to a user's computer. However do take a look at jQuery File Download Plugin (http://johnculviner.com/post/2012/03/22/Ajax-like-feature-rich-file-downloads-with-jQuery-File-Download.aspx) and see if that works for you.

Community
  • 1
  • 1
Gaurav Mantri
  • 128,066
  • 12
  • 206
  • 241
  • Thanks. This is useful. But, I need to download a file generated at runtime, so there is no href. And the file will be different for different users. I am still investigating how this can be done. Will post here once a solution is found. – Manas Feb 12 '13 at 17:58
  • I have come to the conclusion that this is not possible. The workaround is to put the dynamically generated file in a virtual directory location. Then use that location as the href. – Manas Mar 09 '13 at 01:05