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);
            }
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
 public virtual Task SaveAsync(MediaFile mediaFile, MediaStorageItem item)
 => ApplyBlobAsync(mediaFile, item, true);