Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }