public virtual MediaFile UploadFile(MediaType type, Guid rootFolderId, string fileName, long fileLength, Stream fileStream, bool isTemporary = true, string title = "", string description = "") { string folderName = CreateRandomFolderName(); MediaFile file = new MediaFile(); if (!rootFolderId.HasDefaultValue()) { file.Folder = repository.AsProxy <MediaFolder>(rootFolderId); } file.Title = !string.IsNullOrEmpty(title) ? title : Path.GetFileName(fileName); if (!string.IsNullOrEmpty(description)) { file.Description = description; } file.Type = type; file.OriginalFileName = fileName; file.OriginalFileExtension = Path.GetExtension(fileName); file.Size = fileLength; file.FileUri = GetFileUri(type, folderName, fileName); file.PublicUrl = GetPublicFileUrl(type, folderName, fileName); file.IsTemporary = isTemporary; file.IsCanceled = false; file.IsUploaded = null; if (configuration.Security.AccessControlEnabled) { file.AddRule(new AccessRule { AccessLevel = AccessLevel.ReadWrite, Identity = securityService.CurrentPrincipalName }); } unitOfWork.BeginTransaction(); repository.Save(file); unitOfWork.Commit(); Task fileUploadTask = UploadMediaFileToStorageAsync <MediaFile>(fileStream, file.FileUri, file.Id, media => { media.IsUploaded = true; }, media => { media.IsUploaded = false; }, false); fileUploadTask.ContinueWith( task => { // During uploading progress Cancel action can by executed. Need to remove uploaded files from the storage. ExecuteActionOnThreadSeparatedSessionWithNoConcurrencyTracking( session => { var media = session.Get <MediaFile>(file.Id); if (media != null) { if (media.IsCanceled && media.IsUploaded.HasValue && media.IsUploaded.Value) { RemoveFile(media.Id, media.Version); } } }); }); fileUploadTask.Start(); return(file); }
public MediaFile UploadFileWithStream( MediaType type, Guid rootFolderId, string fileName, long fileLength, Stream fileStream, bool waitForUploadResult = false, string title = "", string description = "", Guid?reuploadMediaId = null) { string folderName = CreateRandomFolderName(); MediaFile tempFile; bool createHistoryItem; if (reuploadMediaId.HasValue && !reuploadMediaId.Equals(Guid.Empty)) { var originalEntity = repository.AsQueryable <MediaFile>().FirstOrDefault(f => f.Id == reuploadMediaId); if (originalEntity == null) { throw new EntityNotFoundException("File with specified ID could not be found"); } tempFile = (MediaFile)originalEntity.Clone(); createHistoryItem = true; } else { tempFile = new MediaFile(); if (!rootFolderId.HasDefaultValue()) { tempFile.Folder = repository.AsProxy <MediaFolder>(rootFolderId); } if (!string.IsNullOrEmpty(description)) { tempFile.Description = description; } tempFile.Type = type; tempFile.Title = !string.IsNullOrEmpty(title) ? title : Path.GetFileName(fileName); if (configuration.Security.AccessControlEnabled) { tempFile.AddRule(new AccessRule { AccessLevel = AccessLevel.ReadWrite, Identity = securityService.CurrentPrincipalName }); } createHistoryItem = false; } tempFile.FileUri = GetFileUri(type, folderName, RemoveInvalidHtmlSymbols(fileName)); tempFile.PublicUrl = GetPublicFileUrl(type, folderName, RemoveInvalidHtmlSymbols(fileName)); tempFile.OriginalFileName = fileName; tempFile.OriginalFileExtension = Path.GetExtension(fileName); tempFile.Size = fileLength; tempFile.IsTemporary = true; tempFile.IsCanceled = false; tempFile.IsUploaded = null; unitOfWork.BeginTransaction(); repository.Save(tempFile); if (!waitForUploadResult) { unitOfWork.Commit(); } if (waitForUploadResult) { UploadMediaFileToStorageSync(fileStream, tempFile.FileUri, tempFile, media => { media.IsUploaded = true; media.IsTemporary = false; }, media => { media.IsUploaded = false; }, false); var swapEntity = tempFile.Clone(); if (createHistoryItem) { var originalEntity = repository.AsQueryable <MediaFile>().First(f => f.Id == reuploadMediaId); // swap tempFile.CopyDataTo(swapEntity); originalEntity.CopyDataTo(tempFile); swapEntity.CopyDataTo(originalEntity); tempFile.Original = originalEntity; unitOfWork.Session.SaveOrUpdate(originalEntity); } unitOfWork.Commit(); Events.MediaManagerEvents.Instance.OnMediaFileUpdated(tempFile); } else { Action <MediaFile, ISession> action; if (createHistoryItem) { action = delegate(MediaFile mediaFile, ISession session) { mediaFile.IsUploaded = true; mediaFile.IsTemporary = false; var swapEntity = mediaFile.Clone(); var originalEntity = session.Get <MediaFile>(reuploadMediaId); // swap mediaFile.CopyDataTo(swapEntity); originalEntity.CopyDataTo(mediaFile); swapEntity.CopyDataTo(originalEntity); mediaFile.Original = originalEntity; session.SaveOrUpdate(originalEntity); }; } else { action = delegate(MediaFile mediaFile, ISession session) { mediaFile.IsUploaded = true; mediaFile.IsTemporary = false; }; } Task fileUploadTask = UploadMediaFileToStorageAsync <MediaFile>(fileStream, tempFile.FileUri, tempFile.Id, action, media => { media.IsUploaded = false; }, false); fileUploadTask.ContinueWith( task => { // During uploading progress Cancel action can by executed. Need to remove uploaded files from the storage. ExecuteActionOnThreadSeparatedSessionWithNoConcurrencyTracking( session => { var media = session.Get <MediaFile>(tempFile.Id); if (media != null) { if (media.IsCanceled && media.IsUploaded.HasValue && media.IsUploaded.Value) { RemoveFile(media.Id, media.Version); } } }); }); fileUploadTask.Start(); } return(tempFile); }