public async Task <IHttpActionResult> PostSave(string purpose, SaveFileBindingModel model) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var fileEntries = await userFileRepository.Objects.Where(e => model.FileId.Contains(e.UserFileId)).ToListAsync(); if (fileEntries.Count != model.FileId.Count) { return(BadRequest()); } var forHash = fileEntries.Aggregate("", (h, f) => h + f.UserFileId.ToString() + f.FileSize.ToString()); if (forHash.GetHashCode() != model.Hash) { return(BadRequest()); } await Task.WhenAll(fileEntries.Select(f => { f.State = UserFileState.Saved; return(userFileRepository.SaveInstance(f)); })); var result = fileEntries.Select(f => new SavedFileViewModel { Id = f.UserFileId, FileSize = f.FileSize, Url = f.FilePath }); return(Ok(result)); }
public async Task <IHttpActionResult> PostUpload() { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } string forHash = ""; var answer = new SaveFileBindingModel() { FileId = new List <int>() { } }; HttpRequestMessage request = this.Request; if (!request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } var rnd = new System.Random((int)DateTime.Now.Ticks + Request.GetHashCode()); Func <int, string> randomFileName = (n) => new String( Enumerable.Range(1, n) .Select(x => fileNameChars[rnd.Next(fileNameChars.Length)]) .ToArray()); string newDir; DirectoryInfo di; do { newDir = randomFileName(randomDirNameLen); di = Directory.CreateDirectory(UploadsFolder + newDir); } while (di.CreationTime.AddSeconds(10) < DateTime.Now); string root = UploadsFolder + newDir + @"\"; var provider = new MultipartFormDataStreamProvider(root); await request.Content.ReadAsMultipartAsync(provider); MultipartFileData file = provider.FileData.First(); if (file == null) { return(BadRequest("Not file in input")); } var originalName = file.Headers.ContentDisposition.FileName; var newName = randomFileName(10) + Path.GetExtension(originalName); var newLocalName = UploadsFolder + newDir + @"\" + newName; File.Move(file.LocalFileName, newLocalName); var userFile = new UserFile { UserId = CurrentUser.UserId, FilePath = newDir + @"/" + newName, FileSize = (int)new System.IO.FileInfo(newLocalName).Length, State = UserFileState.JustUploaded, DateCreate = DateTime.Now, ServerId = 1 }; var addedFile = await userFileRepository.SaveInstance(userFile); answer.FileId.Add(addedFile.UserFileId); forHash = forHash + addedFile.UserFileId.ToString() + addedFile.FileSize.ToString(); answer.Hash = forHash.GetHashCode(); return(Ok(answer)); }