public async Task <HttpResponseMessage> UploadResumableAsync() { var uploadingFileInfo = new NeeoFileInfo(); if (!Request.Headers.Contains("uid")) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } if (Request.Headers.Contains("id")) { uploadingFileInfo.Name = Request.Headers.GetValues("id").First(); } else { uploadingFileInfo.Name = Guid.NewGuid().ToString("N"); } if (!Request.Headers.Contains("upload-content-type")) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } if (!Request.Headers.Contains("upload-content-length")) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } if (!Request.Headers.Contains("filename")) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } var contentType = Request.Headers.GetValues("upload-content-type").First(); if (!MimeTypeMapping.ValidateMimeType(contentType)) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } var mimeTypeDetail = MimeTypeMapping.GetMimeTypeDetail(contentType); uploadingFileInfo.Creator = Request.Headers.GetValues("uid").First(); uploadingFileInfo.Length = Convert.ToInt64(Request.Headers.GetValues("upload-content-length").First()); uploadingFileInfo.MimeType = mimeTypeDetail.MimeType; uploadingFileInfo.MediaType = mimeTypeDetail.MediaType; uploadingFileInfo.Extension = mimeTypeDetail.Extension; var session = await UploadSessionManager.CreateSessionAsync(uploadingFileInfo); if (session == null) { return(Request.CreateResponse(HttpStatusCode.InternalServerError)); } var response = new HttpResponseMessage(HttpStatusCode.OK); response.Headers.Add("id", uploadingFileInfo.Name); response.Headers.Location = new Uri(NeeoUrlBuilder.BuildResumableUploadUrl(session.SessionID)); return(response); }
public async Task <HttpResponseMessage> Put([FromUri] string type, [FromUri] string sessionID) { long startingPosition = 0; try { if (type != "resumable" || NeeoUtility.IsNullOrEmpty(sessionID)) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } var session = await UploadSessionManager.ValidateSessionAsync(sessionID); if (session == null) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } session.FileInfo.Extension = MimeTypeMapping.GetMimeTypeDetail(session.FileInfo.MimeType.GetDescription()).Extension; long? contentLength = Request.Content.Headers.ContentLength; string contentType = Request.Content.Headers.ContentType == null ? null : Request.Content.Headers.ContentType.ToString(); if (Request.Content.Headers.Contains("Content-Range")) { var contentRange = Request.Content.Headers.GetValues("Content-Range").First(); if (contentRange == "bytes */*") { var file = SharedMedia.GetMedia(session.FileInfo.Name, session.FileInfo.MediaType); if (file != null) { var response = Request.CreateResponse((HttpStatusCode)308); response.Headers.Add("Range", "bytes=0-" + file.Info.Length); response.ReasonPhrase = "Resumable Incomplete"; return(response); } else { var response = Request.CreateResponse((HttpStatusCode)308); response.Headers.Add("Range", "bytes=0-0"); response.ReasonPhrase = "Resumable Incomplete"; return(response); } } else { var delimeter = new char[] { '-', '/', ' ' }; var rangeValues = contentRange.Split(delimeter); if (rangeValues.Length != 4) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } if (Convert.ToInt64(rangeValues[2]) != session.FileInfo.Length) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } startingPosition = Convert.ToInt64(rangeValues[1]); } } if (contentLength == null || contentLength > (long)session.FileInfo.Length) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } using (var stream = await Request.Content.ReadAsStreamAsync()) { var newFile = new File() { Info = session.FileInfo, FileStream = new FileDataStream() { Stream = stream, Postion = startingPosition } }; if (SharedMedia.Save(new NeeoUser(session.FileInfo.Creator), newFile, FileCategory.Shared, 0)) { // check the length of the file with the database then delete it. await UploadSessionManager.DeleteSessionAsync(sessionID); var response = new HttpResponseMessage(HttpStatusCode.Created); response.Headers.Location = new Uri(newFile.Info.Url); return(response); } } return(Request.CreateResponse(HttpStatusCode.InternalServerError)); } catch (Exception exception) { return(Request.CreateResponse(HttpStatusCode.InternalServerError)); } }