Download ASP.NET WEBAPI file, problems with IE9

I created a way to upload files using ASP.NET WEBAPI, under the code:

[DataContract] public class FileDesc { [DataMember] public string name { get; set; } [DataMember] public string url { get; set; } [DataMember] public long size { get; set; } [DataMember] public string UniqueFileName { get; set; } [DataMember] public int id { get; set; } [DataMember] public DateTime modifiedon { get; set; } [DataMember] public string description { get; set; } public FileDesc(string rootUrl, FileInfo f,int pId, string aFileName) { id = pId; name = aFileName; UniqueFileName = f.Name; url = rootUrl + "/Files/" + f.Name; size = f.Length / 1024; modifiedon = f.LastWriteTime; description = aFileName; } } public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider { //string uniqueFileName = string.Empty; public string UniqueFileName { get; set; } public string ActualFileName { get; set; } public int TaskID { get; set; } private int UserID { get; set; } public CustomMultipartFormDataStreamProvider(string path, int ptaskID, int pUserID) : base(path) { TaskID = ptaskID; UserID = pUserID; } public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers) { var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? headers.ContentDisposition.FileName : "NoName"; ActualFileName = name.Replace("\"", string.Empty); ActualFileName = Path.GetFileName(ActualFileName); UniqueFileName = Guid.NewGuid().ToString() + Path.GetExtension(ActualFileName); int id = SaveFileInfoIntoDatabase(ActualFileName, TaskID, UniqueFileName, UserID); headers.Add("ActualFileName", ActualFileName); headers.Add("id", id.ToString()); return UniqueFileName; } } [Authorize] public class FileUploadController : ApiController { private string StorageRoot { get { return Path.Combine(System.Web.HttpContext.Current.Server.MapPath("~/Files/")); } //Path should! always end with '/' } public Task<IEnumerable<FileDesc>> Post(int id) { string folderName = "Files"; string PATH = HttpContext.Current.Server.MapPath("~/" + folderName); string rootUrl = Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.AbsolutePath, String.Empty); HttpContext.Current.Response.BufferOutput = true; HttpContext.Current.Response.Buffer = true; HttpContext.Current.Response.ContentType = "text/html"; if (Request.Content.IsMimeMultipartContent()) { var streamProvider = new CustomMultipartFormDataStreamProvider(PATH, id, BEL_PMS.Utilities.FormsAuthenticationUtil.GetCurrentUserID); var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<IEnumerable<FileDesc>>(t => { if (t.IsFaulted || t.IsCanceled) { throw new HttpResponseException(HttpStatusCode.InternalServerError); } var fileInfo = streamProvider.FileData.Select(i => { var info = new FileInfo(i.LocalFileName); int FileID = Convert.ToInt32((from h in i.Headers where h.Key =="id" select h.Value.First()).FirstOrDefault()); string ActualFileName = (from h in i.Headers where h.Key =="ActualFileName" select h.Value.First()).FirstOrDefault(); return new FileDesc(rootUrl, info, FileID, ActualFileName); }); return fileInfo; }); //return new HttpResponseMessage { StatusCode = System.Net.HttpStatusCode.OK, Content = task}; return task; } else { throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted")); } } } 

and downloading files via Ajax using the jquery.form.js plugin, the code is below:

 $('#frmmultiupload').ajaxForm({ success: OnUploadedSuccessfully, error: function (x, y) { mesg('Error occured while file upload! Please make sure that total file size is less than 4 MB and try again.', 'error', 'File upload failed.'); } }); 

everything works, but creates a problem in IE9

IE says: "Do you want to open or save from the local host?"

enter image description here The following is the network trace: enter image description here I found some tips here , I don’t know how to convert Task<IEnumerable<FileDesc>> to Task<HttpResponseMessage> .

I set a timeout of 30 seconds in ajaxSetup, so after 30 seconds it causes an error.

+4
source share
3 answers
 var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<HttpResponseMessage>(t => { if (t.IsFaulted || t.IsCanceled) { throw new HttpResponseException(HttpStatusCode.InternalServerError); } var fileInfo = streamProvider.FileData.Select(i => { var info = new FileInfo(i.LocalFileName); int FileID = Convert.ToInt32((from h in i.Headers where h.Key =="id" select h.Value.First()).FirstOrDefault()); string ActualFileName = (from h in i.Headers where h.Key =="ActualFileName" select h.Value.First()).FirstOrDefault(); return new FileDesc(rootUrl, info, FileID, ActualFileName); }); var response = Request.CreateResponse(HttpStatusCode.OK, fileInfo); response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); return response; }); 
+4
source

IE 9 does not support the new XMLHttpRequest Level 2 (IE10 + only), which means the jquery.form.js plugin uses an iframe reserve. Read the following: http://www.malsup.com/jquery/form/#file-upload submitted by the creator of the jquery.form.js plugin. He claims that IE will request a download if the returned data is JSON or Script. Jou should force the title of the content type to "text / html" if you return JSON.

+3
source

I also had the same problem, this problem will only happen in IE when you submit the form, and the WebApi function it refers to returns some value. We did not find the perfect solution to this problem.

In our case, we split the function into two calls. The first function will save the details in the database (provided that the download is successful), and with a callback, we will send a form to upload the file. The return type of the webapi download function is void . if the download fails, we will handle this in the error callback and then delete the corresponding record from the database.

I know that this is not a good solution, but we went with him.

check this question .

+1
source

All Articles