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