public virtual ActionResult AsyncUpload()
{
//we process it distinct ways based on a browser
//find more info here http://stackoverflow.com/questions/4884920/mvc3-valums-ajax-file-upload
Stream stream = null;
var fileName = "";
var contentType = "";
if (String.IsNullOrEmpty(Request["qqfile"]))
{
// IE
HttpPostedFileBase httpPostedFile = Request.Files[0];
if (httpPostedFile == null)
throw new ArgumentException("No file uploaded");
stream = httpPostedFile.InputStream;
fileName = Path.GetFileName(httpPostedFile.FileName);
contentType = httpPostedFile.ContentType;
}
else
{
//Webkit, Mozilla
stream = Request.InputStream;
fileName = Request["qqfile"];
}
var fileBinary = new byte[stream.Length];
stream.Read(fileBinary, 0, fileBinary.Length);
var fileExtension = Path.GetExtension(fileName);
if (!String.IsNullOrEmpty(fileExtension))
fileExtension = fileExtension.ToLowerInvariant();
var download = new Download
{
DownloadGuid = Guid.NewGuid(),
UseDownloadUrl = false,
DownloadUrl = "",
DownloadBinary = fileBinary,
ContentType = contentType,
//we store filename without extension for downloads
Filename = Path.GetFileNameWithoutExtension(fileName),
Extension = fileExtension,
IsNew = true
};
_downloadService.InsertDownload(download);
//when returning JSON the mime-type must be set to text/plain
//otherwise some browsers will pop-up a "Save As" dialog.
return Json(new { success = true,
downloadId = download.Id,
downloadUrl = Url.Action("DownloadFile", new { downloadGuid= download.DownloadGuid }) },
MimeTypes.TextPlain);
}