public async Task <JsonResult> PasteAsync(FullPath dest, IEnumerable <FullPath> paths, bool isCut, IEnumerable <string> renames, string suffix) { var response = new ReplaceResponseModel(); var pathList = paths.ToList(); foreach (var src in pathList) { if (src.IsDirectory) { var newDir = new AzureBlobDirectory(AzureBlobStorageApi.PathCombine(dest.Directory.FullName, src.Directory.Name)); // Check if it already exists if (await newDir.ExistsAsync) { await newDir.DeleteAsync(); } if (isCut) { await RemoveThumbsAsync(src); await AzureBlobStorageApi.MoveDirectoryAsync(src.Directory.FullName, newDir.FullName); response.Removed.Add(src.HashedTarget); } else { // Copy directory await AzureBlobStorageApi.CopyDirectoryAsync(src.Directory.FullName, newDir.FullName); } response.Added.Add(await BaseModel.CreateAsync(newDir, dest.RootVolume)); } else { var newFilePath = AzureBlobStorageApi.PathCombine(dest.Directory.FullName, src.File.Name); await AzureBlobStorageApi.DeleteFileIfExistsAsync(newFilePath); if (isCut) { await RemoveThumbsAsync(src); // Move file await AzureBlobStorageApi.MoveFileAsync(src.File.FullName, newFilePath); response.Removed.Add(src.HashedTarget); } else { // Copy file await AzureBlobStorageApi.CopyFileAsync(src.File.FullName, newFilePath); } response.Added.Add(await CustomBaseModel.CustomCreateAsync(new AzureBlobFile(newFilePath), dest.RootVolume)); } } return(await Json(response)); }
public async Task <JsonResult> TreeAsync(FullPath path) { var response = new TreeResponseModel(); var items = AzureBlobStorageApi.ListFilesAndDirectoriesAsync(path.Directory.FullName); // Add visible directories foreach (var dir in items.Where(i => i.Name.EndsWith("/"))) { var d = new AzureBlobDirectory(dir); if (!d.Attributes.HasFlag(FileAttributes.Hidden)) { response.Tree.Add(await BaseModel.CreateAsync(d, path.RootVolume)); } } return(await Json(response)); }
public async Task <FullPath> ParsePathAsync(string target) { if (string.IsNullOrEmpty(target)) { return(null); } var split = StringHelpers.Split('_', target); var root = Roots.First(r => r.VolumeId == split.Prefix); var path = HttpEncoder.DecodePath(split.Content); var dirUrl = path != root.RootDirectory ? path : string.Empty; var dir = new AzureBlobDirectory(root.RootDirectory + dirUrl); if (await dir.ExistsAsync) { return(new FullPath(root, dir, target)); } var file = new AzureBlobFile(root.RootDirectory + dirUrl); return(new FullPath(root, file, target)); }
public async Task <JsonResult> MakeDirAsync(FullPath path, string name, IEnumerable <string> dirs) { var response = new AddResponseModel(); if (!string.IsNullOrEmpty(name)) { // Create directory var newDir = new AzureBlobDirectory(AzureBlobStorageApi.PathCombine(path.Directory.FullName, name)); await newDir.CreateAsync(); response.Added.Add(await BaseModel.CreateAsync(newDir, path.RootVolume)); } var enumerable = dirs as string[] ?? dirs.ToArray(); if (!enumerable.Any()) { return(await Json(response)); } foreach (var dir in enumerable) { var dirName = dir.StartsWith("/") ? dir.Substring(1) : dir; var newDir = new AzureBlobDirectory(AzureBlobStorageApi.PathCombine(path.Directory.FullName, dirName)); await newDir.CreateAsync(); response.Added.Add(await BaseModel.CreateAsync(newDir, path.RootVolume)); var relativePath = newDir.FullName.Substring(path.RootVolume.RootDirectory.Length); // response.Hashes.Add(new KeyValuePair<string, string>($"/{dirName}", path.RootVolume.VolumeId + HttpEncoder.EncodePath(relativePath))); response.Hashes.Add($"/{dirName}", path.RootVolume.VolumeId + HttpEncoder.EncodePath(relativePath)); } return(await Json(response)); }
public async Task <JsonResult> OpenAsync(FullPath path, bool tree, IEnumerable <string> mimeTypes) { // todo: BaseModel.CreateAsync internally calls GetDirectoriesAsync() which calls AzureBlobStorageApi.ListFilesAndDirectoriesAsync // todo: AzureBlobStorageApi.ListFilesAndDirectoriesAsync is then called again here few lines below; // todo: we should be able to reduce it to one single call var response = new OpenResponse(await BaseModel.CreateAsync(path.Directory, path.RootVolume), path); // Get all files and directories var items = AzureBlobStorageApi.ListFilesAndDirectoriesAsync(path.Directory.FullName); var itemList = items.ToList(); var mimeTypesList = mimeTypes.ToList(); // Add visible files foreach (var file in itemList.Where(i => !i.Name.EndsWith("/"))) { var f = new AzureBlobFile(file); if (f.Attributes.HasFlag(FileAttributes.Hidden)) { continue; } if (mimeTypesList.Any() && !mimeTypesList.Contains(f.MimeType) && !mimeTypesList.Contains(f.MimeType.Type)) { continue; } response.Files.Add(await CustomBaseModel.CustomCreateAsync(f, path.RootVolume)); } // Add visible directories foreach (var dir in itemList.Where(i => i.Name.EndsWith("/"))) { var d = new AzureBlobDirectory(dir); if (!d.Attributes.HasFlag(FileAttributes.Hidden)) { response.Files.Add(await BaseModel.CreateAsync(d, path.RootVolume)); } } // Add parents if (!tree) { return(await Json(response)); } var parent = path.Directory; while (parent != null && parent.FullName != path.RootVolume.RootDirectory) { // Update parent parent = parent.Parent; // Ensure it's a child of the root if (parent != null && path.RootVolume.RootDirectory.Contains(parent.FullName)) { response.Files.Insert(0, await BaseModel.CreateAsync(parent, path.RootVolume)); } } return(await Json(response)); }
public async Task <JsonResult> InitAsync(FullPath path, IEnumerable <string> mimeTypes) { if (path == null) { var root = Roots.FirstOrDefault(r => r.StartDirectory != null) ?? Roots.First(); path = new FullPath(root, new AzureBlobDirectory(root.StartDirectory ?? root.RootDirectory), null); } // todo: BaseModel.CreateAsync internally calls GetDirectoriesAsync() which calls AzureBlobStorageApi.ListFilesAndDirectoriesAsync // todo: AzureBlobStorageApi.ListFilesAndDirectoriesAsync is then called again here few lines below; // todo: we should be able to reduce it to one single call var response = new InitResponseModel(await BaseModel.CreateAsync(path.Directory, path.RootVolume), new Options(path)); // Get all files and directories var items = AzureBlobStorageApi.ListFilesAndDirectoriesAsync(path.Directory.FullName); var itemList = items.ToList(); // Add visible files foreach (var file in itemList.Where(i => !i.Name.EndsWith("/"))) { var f = new AzureBlobFile(file); if (f.Attributes.HasFlag(FileAttributes.Hidden)) { continue; } var mimeTypesList = mimeTypes.ToList(); if (mimeTypesList.Any() && !mimeTypesList.Contains(f.MimeType) && !mimeTypesList.Contains(f.MimeType.Type)) { continue; } response.Files.Add(await CustomBaseModel.CustomCreateAsync(f, path.RootVolume)); } // Add visible directories foreach (var dir in itemList.Where(i => i.Name.EndsWith("/"))) { var d = new AzureBlobDirectory(dir); if (!d.Attributes.HasFlag(FileAttributes.Hidden)) { response.Files.Add(await BaseModel.CreateAsync(d, path.RootVolume)); } } // Add roots foreach (var root in Roots) { response.Files.Add(await BaseModel.CreateAsync(new AzureBlobDirectory(root.RootDirectory), root)); } if (path.RootVolume.RootDirectory != path.Directory.FullName) { // Get all files and directories var entries = AzureBlobStorageApi.ListFilesAndDirectoriesAsync(path.RootVolume.RootDirectory); // Add visible directories foreach (var dir in entries.Where(i => i.Name.EndsWith("/"))) { var d = new AzureBlobDirectory(dir); if (!d.Attributes.HasFlag(FileAttributes.Hidden)) { response.Files.Add(await BaseModel.CreateAsync(d, path.RootVolume)); } } } if (path.RootVolume.MaxUploadSizeInKb.HasValue) { response.Options.UploadMaxSize = $"{path.RootVolume.MaxUploadSizeInKb.Value}K"; } return(await Json(response)); }
public async Task <JsonResult> ExtractAsync(FullPath fullPath, bool newFolder) { var response = new AddResponseModel(); if (fullPath.IsDirectory || fullPath.File.Extension.ToLower() != ".zip") { throw new NotSupportedException("Only .zip files are currently supported."); } var rootPath = fullPath.File.Directory.FullName; if (newFolder) { // Azure doesn't like directory names that look like a file name i.e. blah.png // So iterate through the names until there's no more extension var path = Path.GetFileNameWithoutExtension(fullPath.File.Name); while (Path.HasExtension(path)) { path = Path.GetFileNameWithoutExtension(path); } rootPath = AzureBlobStorageApi.PathCombine(rootPath, path); var rootDir = new AzureBlobDirectory(rootPath); if (!await rootDir.ExistsAsync) { await rootDir.CreateAsync(); } response.Added.Add(await BaseModel.CreateAsync(rootDir, fullPath.RootVolume)); } // Create temp file var archivePath = Path.GetTempFileName(); await File.WriteAllBytesAsync(archivePath, await AzureBlobStorageApi.FileBytesAsync(fullPath.File.FullName)); using (var archive = ZipFile.OpenRead(archivePath)) { var separator = Path.DirectorySeparatorChar.ToString(); foreach (var entry in archive.Entries) { try { var file = AzureBlobStorageApi.PathCombine(rootPath, entry.FullName); if (file.EndsWith(separator)) //directory { var dir = new AzureBlobDirectory(file); if (!await dir.ExistsAsync) { await dir.CreateAsync(); } if (!newFolder) { response.Added.Add(await BaseModel.CreateAsync(dir, fullPath.RootVolume)); } } else { var filePath = Path.GetTempFileName(); entry.ExtractToFile(filePath, true); await using (var stream = new FileStream(filePath, FileMode.Open)) { await AzureBlobStorageApi.PutAsync(file, stream); } File.Delete(filePath); if (!newFolder) { response.Added.Add(await CustomBaseModel.CustomCreateAsync(new AzureBlobFile(file), fullPath.RootVolume)); } } } catch (Exception ex) { throw new Exception(entry.FullName, ex); } } } File.Delete(archivePath); return(await Json(response)); }