in packages/core/src/awsService/s3/commands/uploadFile.ts [51:181]
export async function uploadFileCommand(
s3Client: S3Client,
nodeOrDocument: S3BucketNode | S3FolderNode | vscode.Uri | undefined,
fileSizeBytes: FileSizeBytes = statFile,
getBucket = promptUserForBucket,
getFile = getFilesToUpload,
outputChannel = globals.outputChannel
): 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,
})
if (node) {
const filesToUpload = await getFile(undefined)
if (!filesToUpload) {
showOutputMessage(
localize('AWS.message.error.uploadFileCommand.noFileSelected', 'No file selected, cancelling upload'),
outputChannel
)
getLogger().info('UploadFile cancelled')
telemetry.s3_uploadObject.emit({ result: 'Cancelled' })
return
}
uploadRequests.push(
...filesToUpload.map((file) => {
const key = node!.path + path.basename(file.fsPath)
return fileToUploadRequest(node!.bucket.Name, key, file)
})
)
if (node instanceof S3FolderNode) {
globals.globalState.tryUpdate('aws.lastUploadedToS3Folder', {
bucket: node.bucket,
folder: node.folder,
})
}
} else {
while (true) {
const filesToUpload = await getFile(document)
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.s3_uploadObject.emit({ result: 'Cancelled' })
return
}
const bucketResponse = await getBucket(s3Client).catch((e) => {})
if (!bucketResponse) {
telemetry.s3_uploadObject.emit({ 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.s3_uploadObject.emit({ result: 'Cancelled' })
return
}
const bucketName = bucketResponse.bucket!.Name
if (!bucketName) {
throw Error(`bucketResponse is not a S3.Bucket`)
}
uploadRequests.push(
...filesToUpload.map((file) => {
const key =
bucketResponse.folder !== undefined
? bucketResponse.folder.path + path.basename(file.fsPath)
: path.basename(file.fsPath)
return fileToUploadRequest(bucketName, key, file)
})
)
if (bucketResponse.folder) {
globals.globalState.tryUpdate('aws.lastUploadedToS3Folder', {
bucket: bucketResponse.bucket,
folder: bucketResponse.folder,
})
}
break
}
}
await runBatchUploads(uploadRequests, outputChannel)
void vscode.commands.executeCommand('aws.refreshAwsExplorer', true)
}