/// <summary> /// Filemask, eg. *.*, *file?.txt. /// Bucketname without s3://-prefix. /// </summary> /// <param name="input" /> /// <param name="parameters" /> /// <param name="options" /> /// <param name="cancellationToken" /> /// <returns>List<string></returns> public static async Task <List <string> > UploadFiles( [PropertyTab] UploadInput input, [PropertyTab] Parameters parameters, [PropertyTab] UploadOptions options, CancellationToken cancellationToken ) { if (!parameters.UseDefaultCredentials && parameters.AwsCredentials == null) { parameters.IsAnyNullOrWhiteSpaceThrow(); } if (!Directory.Exists(input.FilePath)) { throw new ArgumentException(@"Source path not found. ", nameof(input.FilePath)); } var localRoot = new DirectoryInfo(input.FilePath); // If filemask is not set, get all files. var filesToCopy = localRoot.GetFiles( input.FileMask ?? "*", options.UploadFromCurrentDirectoryOnly ? SearchOption.TopDirectoryOnly : SearchOption.AllDirectories); if (options.ThrowErrorIfNoMatch && filesToCopy.Length < 1) { throw new ArgumentException($"No files match the filemask within supplied path. {nameof(input.FileMask)}"); } return(await ExecuteUpload(filesToCopy, input.S3Directory, parameters, options, cancellationToken, input)); }
/// <summary> /// Filemask is Windows-style, eg. *.*, *file?.txt /// Bucketname without s3://-prefix. /// </summary> /// <param name="input" /> /// <param name="parameters" /> /// <param name="options" /> /// <param name="cancellationToken" /> /// <returns>List<string></returns> public static List <string> UploadFiles( [PropertyTab] UploadInput input, [PropertyTab] Parameters parameters, [PropertyTab] UploadOptions options, CancellationToken cancellationToken ) { // First check to see if this task gets performed at all. cancellationToken.ThrowIfCancellationRequested(); if (parameters.AwsCredentials == null) { parameters.IsAnyNullOrWhiteSpaceThrow(); } if (!Directory.Exists(input.FilePath)) { throw new ArgumentException(@"Source path not found. ", nameof(input.FilePath)); } var localRoot = new DirectoryInfo(input.FilePath); var filesToCopy = localRoot.GetFiles( input.FileMask ?? "*", // if filemask is not set, get all files. options.UploadFromCurrentDirectoryOnly ? SearchOption.TopDirectoryOnly : SearchOption.AllDirectories); if (options.ThrowErrorIfNoMatch && filesToCopy.Length < 1) { throw new ArgumentException( $"No files match the filemask within supplied path. {nameof(input.FileMask)}"); } return(ExecuteUpload(localRoot, filesToCopy, input.S3Directory, parameters, options, cancellationToken)); }
private static List <string> ExecuteUpload( FileSystemInfo localRoot, IEnumerable <FileInfo> filesToCopy, string s3Directory, Parameters parameters, UploadOptions options, CancellationToken cancellationToken ) { cancellationToken.ThrowIfCancellationRequested(); var result = new List <string>(); using (var client = Utilities.GetS3Client(parameters, cancellationToken)) { var root = Utilities.GetS3Directory( client, s3Directory, parameters.BucketName, cancellationToken); foreach (var file in filesToCopy) { cancellationToken.ThrowIfCancellationRequested(); if (!file.Exists) { throw new IOException($"Source file does not exist: {file.FullName}"); } var s3File = new S3FileInfo( client, parameters.BucketName, Path.Combine( root.Name, options.PreserveFolderStructure ? file.FullName.Replace(Utilities.GetFullPathWithEndingSlashes(localRoot.FullName), string.Empty) : file.Name )); s3File = options.DeleteSource ? s3File.MoveFromLocal(file.FullName, options.Overwrite) : s3File.CopyFromLocal(file.FullName, options.Overwrite); result.Add(options.ReturnListOfObjectKeys ? s3File.FullName : file.FullName); } } return(result); }
/// <summary> /// Prepare to file upload by checking options and file structures. /// </summary> /// <param name="filesToCopy" /> /// <param name="s3Directory" /> /// <param name="parameters" /> /// <param name="options" /> /// <param name="cancellationToken" /> /// <param name="input" /> /// <returns>List<string></returns> private static async Task <List <string> > ExecuteUpload( IEnumerable <FileInfo> filesToCopy, string s3Directory, Parameters parameters, UploadOptions options, CancellationToken cancellationToken, UploadInput input ) { var result = new List <string>(); using (var client = (AmazonS3Client)Utilities.GetS3Client(parameters)) { foreach (var file in filesToCopy) { cancellationToken.ThrowIfCancellationRequested(); if ((file.FullName.Split(Path.DirectorySeparatorChar).Length > input.FilePath.Split(Path.DirectorySeparatorChar).Length&& options.PreserveFolderStructure)) { var subfolders = file.FullName.Replace(file.Name, "").Replace(input.FilePath.Replace(file.Name, ""), "").Replace(Path.DirectorySeparatorChar, '/'); if (subfolders.StartsWith("/")) { subfolders = subfolders.Remove(0, 1); } var fullPath = s3Directory + subfolders + file.Name; if (!options.Overwrite) { try { var request = new GetObjectRequest { BucketName = parameters.BucketName, Key = fullPath }; await client.GetObjectAsync(request, cancellationToken); throw new ArgumentException($"File {file.Name} already exists in S3 at {fullPath}. Set Overwrite-option to true to overwrite the existing file."); } catch (AmazonS3Exception) { } } await UploadFileToS3(cancellationToken, file, parameters, client, fullPath, input); result.Add(options.ReturnListOfObjectKeys ? fullPath : file.FullName); } else { if (!options.Overwrite) { try { var request = new GetObjectRequest { BucketName = parameters.BucketName, Key = s3Directory + file.Name }; await client.GetObjectAsync(request, cancellationToken); throw new ArgumentException($"File {file.Name} already exists in S3 at {request.Key}. Set Overwrite-option to true to overwrite the existing file."); } catch (AmazonS3Exception) { } } await UploadFileToS3(cancellationToken, file, parameters, client, s3Directory + file.Name, input); if (options.ReturnListOfObjectKeys) { result.Add(s3Directory + file.Name); } else { result.Add(file.FullName); } } if (options.DeleteSource) { Utilities.DeleteSourceFile(client, cancellationToken, parameters.BucketName, file.FullName, false); } } } return(result); }