public async Task SaveAsync(MediaFile mediaFile, MediaStorageItem item) { Guard.NotNull(mediaFile, nameof(mediaFile)); if (item == null) { mediaFile.ApplyBlob(null); await _db.SaveChangesAsync(); return; } using (item) { if (_db.DataProvider.CanStreamBlob) { await SaveFast(mediaFile, item); } else { // BLOB stream unsupported var buffer = await item.SourceStream.ToByteArrayAsync(); mediaFile.ApplyBlob(buffer); mediaFile.Size = buffer.Length; await _db.SaveChangesAsync(); } } }
public virtual async Task SaveAsync(MediaFile mediaFile, MediaStorageItem item) { Guard.NotNull(mediaFile, nameof(mediaFile)); // TODO: (?) if the new file extension differs from the old one then the old file never gets deleted var filePath = GetPath(mediaFile); if (item != null) { // Create folder if it does not exist yet var dir = Path.GetDirectoryName(filePath); await _fileSystem.TryCreateDirectoryAsync(dir); using (item) { using var outStream = (await _fileSystem.GetFileAsync(filePath)).OpenWrite(); await item.SaveToAsync(outStream, mediaFile); } } else { // Remove media storage if any await _fileSystem.TryDeleteFileAsync(filePath); } }
/// <summary> /// Applies given media storage <paramref name="item"/> to <paramref name="media"/> entity as blob. /// </summary> /// <param name="media">Media item</param> /// <param name="item">The source item</param> /// <param name="save">Whether to commit changes to <paramref name="media"/> entity to database immediately.</param> public async Task ApplyBlobAsync(IMediaAware media, MediaStorageItem item, bool save = false) { Guard.NotNull(media, nameof(media)); if (item == null) { media.ApplyBlob(null); if (save) { await _db.SaveChangesAsync(); } return; } using (item) { if (_db.DataProvider.CanStreamBlob) { await SaveFast(media, item); } else { // BLOB stream unsupported var buffer = await item.SourceStream.ToByteArrayAsync(); media.ApplyBlob(buffer); media.Size = buffer.Length; if (save) { await _db.SaveChangesAsync(); } } } }
public Task ReceiveAsync(MediaMoverContext context, MediaFile mediaFile, Stream stream) { Guard.NotNull(context, nameof(context)); Guard.NotNull(mediaFile, nameof(mediaFile)); // Store data for later bulk commit if (stream != null && stream.Length > 0) { // Requires AutoDetectChanges set to true or remove explicit entity detaching return(SaveAsync(mediaFile, MediaStorageItem.FromStream(stream))); } return(Task.CompletedTask); }
private async Task <int> SaveFast(MediaFile mediaFile, MediaStorageItem item) { var sourceStream = item.SourceStream; mediaFile.Size = (int)sourceStream.Length; if (mediaFile.MediaStorageId == null) { // Insert new blob var sql = "INSERT INTO [MediaStorage] (Data) Values(@p0)"; mediaFile.MediaStorageId = await _db.DataProvider.InsertIntoAsync(sql, sourceStream); } else { // Update existing blob var sql = "UPDATE [MediaStorage] SET [Data] = @p0 WHERE Id = @p1"; await _db.Database.ExecuteSqlRawAsync(sql, sourceStream, mediaFile.MediaStorageId.Value); } return(mediaFile.MediaStorageId.Value); }
private async Task <int> SaveFast(IMediaAware media, MediaStorageItem item) { var sourceStream = item.SourceStream; media.Size = (int)sourceStream.Length; var streamParam = _db.DataProvider.CreateParameter("p0", sourceStream); if (media.MediaStorageId == null) { // Insert new blob var sql = "INSERT INTO MediaStorage (Data) Values(@p0)"; media.MediaStorageId = await _db.DataProvider.InsertIntoAsync(sql, streamParam); } else { // Update existing blob var sql = "UPDATE MediaStorage SET Data = @p0 WHERE Id = @p1"; var idParam = _db.DataProvider.CreateParameter("p1", media.MediaStorageId.Value); await _db.Database.ExecuteSqlRawAsync(sql, streamParam, idParam); } return(media.MediaStorageId.Value); }
public virtual Task SaveAsync(MediaFile mediaFile, MediaStorageItem item) => ApplyBlobAsync(mediaFile, item, true);