Example #1
0
        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);
        }
Example #2
0
        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));
            }
        }