/// <summary>
        /// Deletes a productFile
        /// </summary>
        /// <param name="productFileMap">Download</param>
        public virtual void DeleteProductFile(ProductFileMap productFileMap)
        {
            if (productFileMap == null)
            {
                throw new ArgumentNullException("productFile");
            }

            _productFileRepository.Delete(productFileMap);

            _eventPubisher.EntityDeleted(productFileMap);
        }
        public ActionResult AsyncUpload(int productId)
        {
            //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 ProductFileMap();

            download.ProductFile = new ProductFile();
            download.ProductFile.DownloadGuid   = Guid.NewGuid();
            download.ProductFile.UseDownloadUrl = false;
            download.ProductFile.DownloadUrl    = "";
            download.ProductFile.DownloadBinary = fileBinary;
            download.ProductFile.ContentType    = contentType;
            download.ProductFile.Filename       = Path.GetFileNameWithoutExtension(fileName);
            download.ProductFile.Extension      = fileExtension;
            download.ProductFile.IsNew          = true;
            download.ProductId               = productId;
            download.DisplayOrder            = _productFileService.GetNumberOfProductFiles(productId) + 1;
            download.ProductFile.Description = "";

            _productFileService.InsertProductFile(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 { downloadId = download.Id })
            }, "text/plain"));
        }