in src/s3/commands/uploadFile.ts [54:171]
export async function uploadFileCommand(
s3Client: S3Client,
nodeOrDocument: S3BucketNode | S3FolderNode | vscode.Uri | undefined,
fileSizeBytes: FileSizeBytes = statFile,
getBucket = promptUserForBucket,
getFile = getFilesToUpload,
window = Window.vscode(),
outputChannel = globals.outputChannel,
commands = Commands.vscode()
): Promise<void> {
let node: S3BucketNode | S3FolderNode | undefined
let document: vscode.Uri | undefined
const uploadRequests: UploadRequest[] = []
if (nodeOrDocument) {
if (nodeOrDocument instanceof S3BucketNode || nodeOrDocument instanceof S3FolderNode) {
node = nodeOrDocument as S3BucketNode | S3FolderNode
document = undefined
} else {
node = undefined
document = nodeOrDocument as vscode.Uri
}
} else {
node = undefined
document = undefined
}
const fileToUploadRequest = (bucketName: string, key: string, file: vscode.Uri) => ({
bucketName,
key: key,
fileLocation: file,
fileSizeBytes: fileSizeBytes(file),
s3Client,
window,
})
if (node) {
const filesToUpload = await getFile(undefined, window)
if (!filesToUpload) {
showOutputMessage(
localize('AWS.message.error.uploadFileCommand.noFileSelected', 'No file selected, cancelling upload'),
outputChannel
)
getLogger().info('UploadFile cancelled')
telemetry.recordS3UploadObject({ result: 'Cancelled' })
return
}
uploadRequests.push(
...filesToUpload.map(file => {
const key = node!.path + path.basename(file.fsPath)
return fileToUploadRequest(node!.bucket.name, key, file)
})
)
} else {
while (true) {
const filesToUpload = await getFile(document, window)
if (!filesToUpload || filesToUpload.length === 0) {
//if file is undefined, means the back button was pressed(there is no step before) or no file was selected
//thus break the loop of the 'wizard'
showOutputMessage(
localize(
'AWS.message.error.uploadFileCommand.noFileSelected',
'No file selected, cancelling upload'
),
outputChannel
)
getLogger().info('UploadFile cancelled')
telemetry.recordS3UploadObject({ result: 'Cancelled' })
return
}
const bucketResponse = await getBucket(s3Client).catch(e => {})
if (!bucketResponse) {
telemetry.recordS3UploadObject({ result: 'Failed' })
return
}
if (typeof bucketResponse === 'string') {
if (bucketResponse === 'back') {
continue
}
showOutputMessage(
localize(
'AWS.message.error.uploadFileCommand.noBucketSelected',
'No bucket selected, cancelling upload'
),
outputChannel
)
getLogger().info('No bucket selected, cancelling upload')
telemetry.recordS3UploadObject({ result: 'Cancelled' })
return
}
const bucketName = bucketResponse.Name
if (!bucketName) {
throw Error(`bucketResponse is not a S3.Bucket`)
}
uploadRequests.push(
...filesToUpload.map(file => {
const key = path.basename(file.fsPath)
return fileToUploadRequest(bucketName, key, file)
})
)
break
}
}
await runBatchUploads(uploadRequests, window, outputChannel)
commands.execute('aws.refreshAwsExplorer', true)
}