public async Task <IActionResult> PostFile() { long storageId = 1; // TODO: Variabel machen if (!Request.HasFormContentType) { return(BadRequest()); } Models.FileVersion @version = new FileVersion(); var form = Request.Form; foreach (IFormFile formFile in form.Files) { StorageSettingFilesystem @storageSetting = await _context.StoragesSettingsFilesystem.SingleOrDefaultAsync(m => m.StorageId == storageId); @version.Created = DateTimeOffset.Now; @version.LastAccess = DateTime.Now; @version.Extension = Tools.Files.GetFileExtension(formFile.FileName); @version.StorageId = @storageSetting.StorageId; @version.FileGuid = Guid.NewGuid(); @version.ContentType = formFile.ContentType; @version.OriginalFileName = formFile.FileName; @version.HashSha256 = Tools.Files.GenerateHashSHA256(formFile.OpenReadStream()); @version.SubPath = GetSubPath(@storageSetting); @version.FileSizeInBytes = formFile.Length; @version.File = new Models.File(); if (!ModelState.IsValid) { return(BadRequest(ModelState)); } string targetDirectory = Path.Combine(@storageSetting.BasePath, @version.SubPath); if (!Directory.Exists(targetDirectory)) { Directory.CreateDirectory(targetDirectory); } string fileName = @version.FileGuid.ToString().Trim('{').Trim('}') + "." + @version.Extension; var savePath = Path.Combine(targetDirectory, fileName); using (var fileStream = new FileStream(savePath, FileMode.Create)) { formFile.CopyTo(fileStream); } _context.FileVersions.Add(@version); await _context.SaveChangesAsync(); @version.File.CurrentVersionId = @version.FileVersionId; await _context.SaveChangesAsync(); } return(Created($"api/files/{@version.File.FileId}", @version.File.FileId)); }
public async Task <IActionResult> DownloadFileVersion([FromRoute] long fileId, long versionId) { FileVersion @version = await _context.FileVersions.SingleAsync(m => m.FileId == fileId && m.FileVersionId == versionId); StorageSettingFilesystem @storageSetting = await _context.StoragesSettingsFilesystem.FirstAsync(s => s.StorageId == @version.StorageId); string filePath = Path.Combine(@storageSetting.BasePath, @version.SubPath, @version.FileGuid.ToString() + "." + @version.Extension); FileStream fs = new FileStream(filePath, FileMode.Open); return(File(fs, @version.ContentType, @version.OriginalFileName)); }
public async Task <IActionResult> DownloadFile([FromRoute] long id) { Models.File @file = GetFileObject(id); // loading related data _context.Entry(@file).Reference(v => v.CurrentVersion).Load(); StorageSettingFilesystem @storageSetting = await _context.StoragesSettingsFilesystem.FirstAsync(s => s.StorageId == @file.CurrentVersion.StorageId); string filePath = Path.Combine(@storageSetting.BasePath, @file.CurrentVersion.SubPath, @file.CurrentVersion.FileGuid.ToString() + "." + @file.CurrentVersion.Extension); FileStream fs = new FileStream(filePath, FileMode.Open); return(File(fs, @file.CurrentVersion.ContentType)); // "application /octet-stream"); // FileStreamResult }
public async Task <IActionResult> PutFile([FromRoute] long id) // , [FromBody] Models.File @file) { long storageId = 1; // TODO: Variabel machen StorageSettingFilesystem @storageSetting = await _context.StoragesSettingsFilesystem.SingleOrDefaultAsync(m => m.StorageId == storageId); var form = Request.Form; if (form.Files.Count == 0) { return(BadRequest("File missing")); } if (form.Files.Count > 1) { return(BadRequest("only one file allowed")); } IFormFile formFile = Request.Form.Files[0]; Models.File @file = GetFileObject(id); FileVersion @version = new FileVersion(); //@version.File = @file; //.FileId; @version.FileId = @file.FileId; @version.Created = DateTimeOffset.Now; @version.LastAccess = DateTime.Now; @version.Extension = Tools.Files.GetFileExtension(formFile.FileName); @version.StorageId = @storageSetting.StorageId; @version.FileGuid = Guid.NewGuid(); @version.ContentType = formFile.ContentType; @version.OriginalFileName = formFile.FileName; @version.HashSha256 = Tools.Files.GenerateHashSHA256(formFile.OpenReadStream()); @version.SubPath = GetSubPath(@storageSetting); @version.FileSizeInBytes = formFile.Length; if (!ModelState.IsValid) { return(BadRequest(ModelState)); } string targetDirectory = Path.Combine(@storageSetting.BasePath, @version.SubPath); if (!Directory.Exists(targetDirectory)) { Directory.CreateDirectory(targetDirectory); } string fileName = @version.FileGuid.ToString().Trim('{').Trim('}') + "." + @version.Extension; var savePath = Path.Combine(targetDirectory, fileName); using (var fileStream = new FileStream(savePath, FileMode.Create)) { formFile.CopyTo(fileStream); } _context.FileVersions.Add(@version); try { await _context.SaveChangesAsync(); _context.Entry(@version).State = EntityState.Modified; @version.File.CurrentVersionId = @version.FileVersionId; await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException ex) { if (!VersionExistsInDatabase(id)) { return(NotFound()); } else { throw; } } return(CreatedAtAction("GetFileObject", new { id = @file.FileId }, @file)); }
private string GetSubPath(StorageSettingFilesystem @storageSetting) { long maxId = this._context.FileVersions.Where(f => f.StorageId == @storageSetting.StorageId).Max(f => f.FileId) + 1; return(Math.Ceiling((decimal)maxId / (decimal)@storageSetting.MaxElements).ToString()); }