示例#1
0
        private string GetParentUrl(string baseUri, string blobPrefix)
        {
            var segments   = GetOutlineFromUrl(blobPrefix);
            var parentPath = string.Join(Delimiter, segments.Take(segments.Length - 1));

            return(UrlHelperExtensions.Combine(baseUri, EscapeUri(parentPath)));
        }
示例#2
0
        protected virtual async Task MoveAsync(string oldUrl, string newUrl, bool isCopy = false)
        {
            string oldPath, newPath;
            var    isFolderRename = string.IsNullOrEmpty(Path.GetFileName(oldUrl));

            var containerName = GetContainerNameFromUrl(oldUrl);

            //if rename file
            if (!isFolderRename)
            {
                oldPath = GetFilePathFromUrl(oldUrl);
                newPath = GetFilePathFromUrl(newUrl);
            }
            else
            {
                oldPath = GetDirectoryPathFromUrl(oldUrl);
                newPath = GetDirectoryPathFromUrl(newUrl);
            }

            var taskList      = new List <Task>();
            var blobContainer = _blobServiceClient.GetBlobContainerClient(containerName);
            var blobItems     = blobContainer.GetBlobsAsync(prefix: oldPath);

            await foreach (var blobItem in blobItems)
            {
                var blobName    = UrlHelperExtensions.Combine(containerName, blobItem.Name);
                var newBlobName = blobName.Replace(oldPath, newPath);

                taskList.Add(MoveBlob(blobContainer, blobName, newBlobName, isCopy));
            }

            await Task.WhenAll(taskList);
        }
示例#3
0
        public virtual async Task RemoveAsync(string[] urls)
        {
            foreach (var url in urls)
            {
                var absoluteUri = url.IsAbsoluteUrl()
                    ? new Uri(url).ToString()
                    : UrlHelperExtensions.Combine(_blobServiceClient.Uri.ToString(), url);
                var blobContainer = GetBlobContainer(GetContainerNameFromUrl(absoluteUri));

                var isFolder         = string.IsNullOrEmpty(Path.GetFileName(absoluteUri));
                var blobSearchPrefix = isFolder ? GetDirectoryPathFromUrl(absoluteUri)
                                             : GetFilePathFromUrl(absoluteUri);

                if (string.IsNullOrEmpty(blobSearchPrefix))
                {
                    await blobContainer.DeleteIfExistsAsync();
                }
                else
                {
                    var blobItems = blobContainer.GetBlobsAsync(prefix: blobSearchPrefix);
                    await foreach (var blobItem in blobItems)
                    {
                        var blobClient = blobContainer.GetBlobClient(blobItem.Name);
                        await blobClient.DeleteIfExistsAsync();
                    }
                }
            }
        }
示例#4
0
        public IBlobContentStorageProvider CreateProvider(string basePath)
        {
            var clonedOptions = _options.Clone() as AzureContentBlobOptions;

            clonedOptions.RootPath = UrlHelperExtensions.Combine(clonedOptions.RootPath, basePath);
            return(new AzureContentBlobStorageProvider(new OptionsWrapper <AzureContentBlobOptions>(clonedOptions), _platformOptions, _settingsManager));
        }
        private string GetExportFilePath(string entityName)
        {
            if (string.IsNullOrEmpty(_platformOptions.DefaultExportFolder))
            {
                throw new PlatformException($"{nameof(_platformOptions.DefaultExportFolder)} must be set.");
            }

            const string template = "{0}_{1:yyyyMMddHHmmss}.csv";

            var result = string.Format(template, entityName, DateTime.UtcNow);

            return(UrlHelperExtensions.Combine(_platformOptions.DefaultExportFolder, result));
        }
        /// <summary>
        /// Chroot url (artificial add parent 'chroot' folder)
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        private string NormalizeUrl(string url)
        {
            var result = _options.RootPath;

            if (!string.IsNullOrEmpty(url))
            {
                if (url.IsAbsoluteUrl())
                {
                    url = Uri.UnescapeDataString(new Uri(url).AbsolutePath);
                }
                result = UrlHelperExtensions.Combine(_options.RootPath, url.Replace(_options.RootPath, string.Empty));
            }
            return(result);
        }
        public async Task ExportBackgroundAsync(ExportDataRequest request, ExportPushNotification notification, IJobCancellationToken cancellationToken, PerformContext context)
        {
            void progressCallback(ExportProgressInfo x)
            {
                notification.Patch(x);
                notification.JobId = context.BackgroundJob.Id;
                _pushNotificationManager.Send(notification);
            }

            try
            {
                if (string.IsNullOrEmpty(_platformOptions.DefaultExportFolder))
                {
                    throw new PlatformException($"{nameof(_platformOptions.DefaultExportFolder)} should be set.");
                }

                var fileName = string.Format(FileNameTemplate, DateTime.UtcNow);

                // Do not like provider creation here to get file extension, maybe need to pass created provider to Exporter.
                // Create stream inside Exporter is not good as it is not Exporter resposibility to decide where to write.
                var provider = _exportProviderFactory.CreateProvider(request);

                if (!string.IsNullOrEmpty(provider.ExportedFileExtension))
                {
                    fileName = Path.ChangeExtension(fileName, provider.ExportedFileExtension);
                }

                var url = UrlHelperExtensions.Combine(_platformOptions.DefaultExportFolder, fileName);
                using (var blobStream = _blobStorageProvider.OpenWrite(url))
                {
                    _dataExporter.Export(blobStream, request, progressCallback, new JobCancellationTokenWrapper(cancellationToken));
                }

                notification.DownloadUrl = _blobUrlResolver.GetAbsoluteUrl(url);
            }
            catch (JobAbortedException)
            {
                //do nothing
            }
            catch (Exception ex)
            {
                notification.Errors.Add(ex.ExpandExceptionMessage());
            }
            finally
            {
                notification.Description = "Export finished";
                notification.Finished    = DateTime.UtcNow;
                await _pushNotificationManager.SendAsync(notification);
            }
        }
示例#8
0
        private BlobInfo ConvertBlobToBlobInfo(BlobItem blob, string baseUri)
        {
            var absoluteUrl = UrlHelperExtensions.Combine(baseUri, EscapeUri(blob.Name));
            var relativeUrl = absoluteUrl.Replace(EscapeUri(_blobServiceClient.Uri.ToString()), string.Empty);
            var fileName    = Path.GetFileName(blob.Name);
            var contentType = MimeTypeResolver.ResolveContentType(fileName);

            return(new BlobInfo
            {
                Url = absoluteUrl,
                Name = fileName,
                ContentType = contentType,
                Size = blob.Properties.ContentLength ?? 0,
                ModifiedDate = blob.Properties.LastModified?.DateTime,
                RelativeUrl = relativeUrl
            });
        }
示例#9
0
        private BlobInfo ConvertBlobToBlobInfo(BlobClient blob, BlobProperties props)
        {
            var absoluteUrl = blob.Uri;
            var relativeUrl = UrlHelperExtensions.Combine(GetContainerNameFromUrl(blob.Uri.ToString()), EscapeUri(blob.Name));
            var fileName    = Path.GetFileName(Uri.UnescapeDataString(blob.Name));
            var contentType = MimeTypeResolver.ResolveContentType(fileName);

            return(new BlobInfo
            {
                Url = absoluteUrl.ToString(),
                Name = fileName,
                ContentType = contentType,
                Size = props.ContentLength,
                ModifiedDate = props.LastModified.DateTime,
                RelativeUrl = relativeUrl
            });
        }
示例#10
0
        public string GetAbsoluteUrl(string blobKey)
        {
            var result = blobKey;

            if (!blobKey.IsAbsoluteUrl())
            {
                var baseUrl = _blobServiceClient.Uri.AbsoluteUri;

                if (!string.IsNullOrWhiteSpace(_cdnUrl))
                {
                    var cdnUriBuilder = new UriBuilder(_blobServiceClient.Uri.Scheme, _cdnUrl);
                    baseUrl = cdnUriBuilder.Uri.AbsoluteUri;
                }

                result = UrlHelperExtensions.Combine(baseUrl, EscapeUri(blobKey));
            }

            return(result);
        }
示例#11
0
        public virtual async Task CreateFolderAsync(BlobFolder folder)
        {
            var path = folder.ParentUrl == null ?
                       folder.Name :
                       UrlHelperExtensions.Combine(folder.ParentUrl, folder.Name);

            var containerName = GetContainerNameFromUrl(path);
            var container     = _blobServiceClient.GetBlobContainerClient(containerName);
            await container.CreateIfNotExistsAsync(PublicAccessType.Blob);

            var directoryPath = GetDirectoryPathFromUrl(path);

            if (!string.IsNullOrEmpty(directoryPath))
            {
                //Need upload empty blob because azure blob storage not support direct directory creation
                using var stream = new MemoryStream(new byte[0]);
                await container.GetBlockBlobClient(directoryPath).UploadAsync(stream);
            }
        }
示例#12
0
        public virtual async Task <BlobEntrySearchResult> SearchAsync(string folderUrl, string keyword)
        {
            var result = AbstractTypeFactory <BlobEntrySearchResult> .TryCreateInstance();

            if (!string.IsNullOrEmpty(folderUrl))
            {
                var container = GetBlobContainer(GetContainerNameFromUrl(folderUrl));

                if (container != null)
                {
                    var baseUriEscaped = EscapeUri(container.Uri.AbsoluteUri);
                    var prefix         = GetDirectoryPathFromUrl(folderUrl);
                    if (!string.IsNullOrEmpty(keyword))
                    {
                        //Only whole container list allow search by prefix
                        prefix += keyword;
                    }

                    // Call the listing operation and return pages of the specified size.
                    var resultSegment = container.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: Delimiter)
                                        .AsPages();

                    // Enumerate the blobs returned for each page.
                    await foreach (var blobPage in resultSegment)
                    {
                        // A hierarchical listing may return both virtual directories and blobs.
                        foreach (var blobhierarchyItem in blobPage.Values)
                        {
                            if (blobhierarchyItem.IsPrefix)
                            {
                                var folder = AbstractTypeFactory <BlobFolder> .TryCreateInstance();

                                // No Unescaping for Name. Unescaping a string that has been previously unescaped can lead to ambiguities and errors.
                                folder.Name = blobhierarchyItem.Prefix
                                              .Split(new[] { Delimiter }, StringSplitOptions.RemoveEmptyEntries)
                                              .Last();

                                folder.Url         = UrlHelperExtensions.Combine(baseUriEscaped, EscapeUri(blobhierarchyItem.Prefix));
                                folder.ParentUrl   = GetParentUrl(baseUriEscaped, blobhierarchyItem.Prefix);
                                folder.RelativeUrl = folder.Url.Replace(EscapeUri(_blobServiceClient.Uri.ToString()), string.Empty);
                                result.Results.Add(folder);
                            }
                            else
                            {
                                var blobInfo = ConvertBlobToBlobInfo(blobhierarchyItem.Blob, baseUriEscaped);
                                //Do not return empty blob (created with directory because azure blob not support direct directory creation)
                                if (!string.IsNullOrEmpty(blobInfo.Name))
                                {
                                    result.Results.Add(blobInfo);
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                // Call the listing operation and enumerate the result segment.
                var resultSegment = _blobServiceClient.GetBlobContainersAsync().AsPages();

                await foreach (var containerPage in resultSegment)
                {
                    foreach (var item in containerPage.Values)
                    {
                        var folder = AbstractTypeFactory <BlobFolder> .TryCreateInstance();

                        folder.Name = item.Name.Split(Delimiter).Last();
                        folder.Url  = EscapeUri(UrlHelperExtensions.Combine(_blobServiceClient.Uri.ToString(), item.Name));
                        result.Results.Add(folder);
                    }
                }
            }

            result.TotalCount = result.Results.Count();
            return(result);
        }