public async Task <JsonResult> RenameAsync(FullPath path, string name) { var response = new ReplaceResponseModel(); response.Removed.Add(path.HashedTarget); await RemoveThumbsAsync(path); if (path.IsDirectory) { // Get new path var newPath = AzureBlobStorageApi.PathCombine(path.Directory.Parent.FullName, name); // Move file await AzureBlobStorageApi.MoveDirectoryAsync(path.Directory.FullName, newPath); // Add it to added entries list response.Added.Add(await BaseModel.CreateAsync(new AzureBlobDirectory(newPath), path.RootVolume)); } else { // Get new path var newPath = AzureBlobStorageApi.PathCombine(path.File.DirectoryName ?? string.Empty, name); // Move file await AzureBlobStorageApi.MoveFileAsync(path.File.FullName, newPath); // Add it to added entries list response.Added.Add(await CustomBaseModel.CustomCreateAsync(new AzureBlobFile(newPath), path.RootVolume)); } return(await Json(response)); }
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> MakeFileAsync(FullPath path, string name) { var newFile = new AzureBlobFile(AzureBlobStorageApi.PathCombine(path.Directory.FullName, name)); await newFile.CreateAsync(); var response = new AddResponseModel(); response.Added.Add(await CustomBaseModel.CustomCreateAsync(newFile, path.RootVolume)); return(await Json(response)); }
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> UploadAsync(FullPath path, IEnumerable <IFormFile> files, bool?overwrite, IEnumerable <FullPath> uploadPaths, IEnumerable <string> renames, string suffix) { var response = new AddResponseModel(); var fileList = files.ToList(); // Check if max upload size is set and that no files exceeds it if (path.RootVolume.MaxUploadSize.HasValue && fileList.Any(x => x.Length > path.RootVolume.MaxUploadSize)) { // Max upload size exceeded return(Error.MaxUploadFileSize()); } foreach (var rename in renames) { var fileInfo = new FileInfo(Path.Combine(path.Directory.FullName, rename)); var destination = Path.Combine(path.Directory.FullName, $"{Path.GetFileNameWithoutExtension(rename)}{suffix}{Path.GetExtension(rename)}"); fileInfo.MoveTo(destination); response.Added.Add(await CustomBaseModel.CustomCreateAsync(new AzureBlobFile(destination), path.RootVolume)); } var uploadPathList = uploadPaths.ToList(); foreach (var uploadPath in uploadPathList) { var dir = uploadPath.Directory; while (dir.FullName != path.RootVolume.RootDirectory) { response.Added.Add(await BaseModel.CreateAsync(new AzureBlobDirectory(dir.FullName), path.RootVolume)); dir = dir.Parent; } } var i = 0; foreach (var file in fileList) { var destination = uploadPathList.Count() > i?uploadPathList.ElementAt(i).Directory.FullName : path.Directory.FullName; var azureFile = new AzureBlobFile(AzureBlobStorageApi.PathCombine(destination, Path.GetFileName(file.FileName))); if (await azureFile.ExistsAsync) { if (overwrite ?? path.RootVolume.UploadOverwrite) { await azureFile.DeleteAsync(); await AzureBlobStorageApi.UploadAsync(file, azureFile.FullName); response.Added.Add(await CustomBaseModel.CustomCreateAsync(new AzureBlobFile(azureFile.FullName), path.RootVolume)); } else { var newName = await CreateNameForCopy(azureFile, suffix); await AzureBlobStorageApi.UploadAsync(file, AzureBlobStorageApi.PathCombine(azureFile.DirectoryName, newName)); response.Added.Add(await CustomBaseModel.CustomCreateAsync(new AzureBlobFile(newName), path.RootVolume)); } } else { await AzureBlobStorageApi.UploadAsync(file, azureFile.FullName); response.Added.Add(await CustomBaseModel.CustomCreateAsync(new AzureBlobFile(azureFile.FullName), path.RootVolume)); } i++; } return(await Json(response)); }
public async Task <JsonResult> ArchiveAsync(FullPath parentPath, IEnumerable <FullPath> paths, string filename, string mimeType) { var response = new AddResponseModel(); if (paths == null) { throw new NotSupportedException(); } if (mimeType != "application/zip") { throw new NotSupportedException("Only .zip files are currently supported."); } var directoryInfo = parentPath.Directory; if (directoryInfo == null) { return(await Json(response)); } filename ??= "newfile"; if (filename.EndsWith(".zip")) { filename = filename.Replace(".zip", ""); } var newPath = AzureBlobStorageApi.PathCombine(directoryInfo.FullName, filename + ".zip"); await AzureBlobStorageApi.DeleteFileIfExistsAsync(newPath); var archivePath = Path.GetTempFileName(); var pathList = paths.ToList(); using (var newFile = ZipFile.Open(archivePath, ZipArchiveMode.Update)) { foreach (var tg in pathList) { if (tg.IsDirectory) { await AddDirectoryToArchiveAsync(newFile, tg.Directory, ""); } else { var filePath = Path.GetTempFileName(); await File.WriteAllBytesAsync(filePath, await AzureBlobStorageApi.FileBytesAsync(tg.File.FullName)); newFile.CreateEntryFromFile(filePath, tg.File.Name); } } } await using (var stream = new FileStream(archivePath, FileMode.Open)) { await AzureBlobStorageApi.PutAsync(newPath, stream); } // Cleanup File.Delete(archivePath); response.Added.Add(await CustomBaseModel.CustomCreateAsync(new AzureBlobFile(newPath), parentPath.RootVolume)); 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)); }