public void TestGetMediaTypeFromString(string code, string expectedExtension) { MediaType mediaType = MediaType.FromString(code); Output.WriteLine($"MediaType {code} has extension:" + mediaType.Extensions.First(x => x.Contains(expectedExtension))); Assert.Equal(expectedExtension, mediaType.Extensions.First(x => x.Contains(expectedExtension))); }
protected override void OnModelCreating(ModelBuilder modelBuilder) { // Query filters for soft delete modelBuilder.Entity <Account>().HasQueryFilter(f => f.DeletedAt == null); modelBuilder.Entity <Page>().HasQueryFilter(f => f.DeletedAt == null); modelBuilder.Entity <Notice>().HasQueryFilter(f => f.DeletedAt == null); modelBuilder.Entity <Quiz>().HasQueryFilter(f => f.DeletedAt == null); // Enum Conversions modelBuilder.Entity <Page>().Property(p => p.Section).HasConversion(c => (int)c, c => (Section)c); modelBuilder.Entity <Page>().Property(p => p.QuickLink).HasConversion(c => (int)c, c => (QuickLinkSection)c); modelBuilder.Entity <CmsButton>().Property(p => p.Align).HasConversion(c => (int)c, c => (Align)c); modelBuilder.Entity <CmsButton>().Property(p => p.Color).HasConversion(c => (int)c, c => (Color)c); // Discover Deep Cove modelBuilder.Entity <Activity>().Property(p => p.ActivityType).HasConversion(c => (int)c, c => (ActivityType)c); // Noticeboard modelBuilder.Entity <Notice>().Property(p => p.Noticeboard).HasConversion(c => (int)c, c => (Noticeboard)c); // End Enum Conversions // Conversions modelBuilder.Entity <BaseMedia>().Property(p => p.MediaType).HasConversion(c => c.Mime, c => MediaType.FromString(c)); modelBuilder.Entity <ImageMedia>().Property(p => p.Versions) .HasConversion(c => JsonConvert.SerializeObject(c), c => JsonConvert.DeserializeObject <List <ImageVersion> >(c)); // End conversions // Define keys for junction tables modelBuilder.Entity <ChannelMembership>() .HasKey(e => new { e.AccountId, e.NotificationChannelId }); modelBuilder.Entity <RevisionTextComponent>() .HasKey(e => new { e.PageRevisionId, e.TextComponentId }); modelBuilder.Entity <RevisionMediaComponent>() .HasKey(e => new { e.PageRevisionId, e.MediaComponentId }); // -- Discover Deep Cove modelBuilder.Entity <ActivityImage>() .HasKey(e => new { e.ActivityId, e.ImageId }); modelBuilder.Entity <FactFileEntryImage>() .HasKey(e => new { e.FactFileEntryId, e.MediaFileId }); // --------------------- // Place unique constraints onto appropriate properties modelBuilder.Entity <PageTemplate>() .HasIndex(e => e.Name).IsUnique(); modelBuilder.Entity <Page>() .HasIndex(e => e.Name).IsUnique(); // -- Configure relationship between activities and media files modelBuilder.Entity <Activity>().HasMany(a => a.ActivityImages).WithOne(ai => ai.Activity).HasForeignKey(ai => ai.ActivityId).OnDelete(DeleteBehavior.Restrict); // -- Configure relationships between fact file entries and media files modelBuilder.Entity <FactFileEntry>().HasMany(ff => ff.FactFileEntryImages).WithOne(ei => ei.FactFileEntry).HasForeignKey(ei => ei.FactFileEntryId).OnDelete(DeleteBehavior.Restrict); // -- Configure relationships between pages and navitems modelBuilder.Entity <Page>().HasMany(p => p.NavItems).WithOne(ni => ni.Page).HasForeignKey(ni => ni.PageId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity <Page>().HasMany(p => p.NavItemPages).WithOne(ni => ni.Page).HasForeignKey(ni => ni.PageId).OnDelete(DeleteBehavior.Cascade); // -- Configure relationship between question and correct answer modelBuilder.Entity <QuizQuestion>().HasOne(q => q.CorrectAnswer).WithOne(a => a.CorrectForQuestion).OnDelete(DeleteBehavior.Cascade); }
public async Task <IActionResult> Index(IFormCollection request) { try { // Create required directories if not existing EnsureInit(); // Deserialize cropping data if applicable CropData cropData = null; if (request.Str("cropData") != null) { cropData = JsonConvert.DeserializeObject <CropData>(request.Str("cropData")); } // Original filename string uploadedName = request.Str("filename"); // Generate a backend filename for the uploaded file - same extension as uploaded file. string filename = Guid.NewGuid().ToString() + Path.GetExtension(uploadedName); string fileType = request.Str("fileType"); // Determine what type of file has been uploaded and act accordingly (may want to refactor these) // FOR IMAGES if (MediaType.MimesForCategory(MediaCategory.Image).Contains(fileType)) { string filepath = Path.Combine("Storage", "Media", "Images", filename); // Save image and all associated versions of it. var filedata = ImageUtils.SaveImage(request.Str("file") .Split(',')[1], filepath, cropData); // Create database record to track images ImageMedia dbImageMedia = new ImageMedia { Name = Path.GetFileNameWithoutExtension(uploadedName), MediaType = MediaType.FromString(fileType), FilePath = filepath, Size = filedata["size"], Title = request.Str("title"), Alt = request.Str("alt"), Width = filedata["width"], Height = filedata["height"], Versions = filedata["versions"] }; await _Db.AddAsync(dbImageMedia); } // FOR AUDIO else if (MediaType.MimesForCategory(MediaCategory.Audio).Contains(fileType)) { string filepath = Path.Combine("Storage", "Media", "Audio", filename); // Save the audio file byte[] bytes = request.Str("file").Split(',')[1].DecodeBase64Bytes(); await System.IO.File.WriteAllBytesAsync(filepath, bytes); // Read the audio file to determine its duration - it will either be mp3(mpeg) or wav // Configure ffprobe path using appsettings values FFProbe probe = new FFProbe(); probe.ToolPath = _Config["ffprobePath"]; // If running linux, look for ffprobe instaed of ffprobe.exe if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { probe.FFProbeExeName = "ffprobe"; } // Get audio file metadata MediaInfo mediaInfo = probe.GetMediaInfo(Path.Combine(_HostingEnv.ContentRootPath, filepath)); // Create the media database record AudioMedia audioMedia = new AudioMedia { Name = Path.GetFileNameWithoutExtension(uploadedName), MediaType = MediaType.FromString(fileType), FilePath = filepath, Size = new FileInfo(filepath).Length, Duration = Math.Round(mediaInfo.Duration.TotalSeconds) }; await _Db.AddAsync(audioMedia); } // FOR GENERAL else if (MediaType.MimesForCategory(MediaCategory.General).Contains(fileType)) { string filepath = Path.Combine("Storage", "Media", "Documents", filename); // Save the file byte[] bytes = request.Str("file").Split(',')[1].DecodeBase64Bytes(); System.IO.File.WriteAllBytes(filepath, bytes); // Create the media database record GeneralMedia generalMedia = new GeneralMedia { Name = Path.GetFileNameWithoutExtension(uploadedName), MediaType = MediaType.FromString(fileType), FilePath = filepath, Size = new FileInfo(filepath).Length, }; await _Db.AddAsync(generalMedia); } else { return(new UnsupportedMediaTypeResult()); } await _Db.SaveChangesAsync(); return(Ok()); } catch (Exception ex) { _Logger.LogError("Error uploading file: {0}", ex.Message); _Logger.LogError(ex.StackTrace); return(BadRequest(new ResponseHelper("Something went wrong, please contact the devloper if the problem persists", ex.Message))); } }