Osc*_*ley 1 powershell file-upload amazon-s3 amazon-web-services
我需要从 PowerShell 脚本上传文件(总共 100GB,有几个 10GB 的文件)到 S3:http : //docs.aws.amazon.com/powershell/latest/reference/Index.html(亚马逊简单存储服务)
我已经使用了适用于 .NET 的 AWS 开发工具包,并且非常适合少量文件。我只是在之前的代码中创建了存储桶并尝试使用 Write-S3Object 上传所有文件
Write-S3Object -Region $S3_Region -AccessKey $S3_AccessKey -SecretKey $S3_SecretKey -ServerSideEncryption "AES256" -Folder $sourceFolder -BucketName $S3_Bucket -Recurse -KeyPrefix "/"
Run Code Online (Sandbox Code Playgroud)
但是我在稳定性方面有几个问题。它经常因两种类型的错误而失败。(有4683个文件要上传)
将 2664 个对象从 'R:\temp\files' 上传到存储桶 'bucket.test' ,键前缀为 '/'
将 35 个对象从 'R:\temp\files' 上传到存储桶 'bucket.test',键前缀为 '/' System.InvalidOperationException:指定的上传不存在。上传 ID 可能无效,或者上传可能已中止或完成。---> Amazon.S3.AmazonS3Exception:指定的上传不存在。上传 ID 可能无效,或者上传可能已中止或完成。---> Amazon.Runtime.Internal.HttpErrorResponseException:远程服务器返回错误:(404) 未找到。---> System.Net.WebException:远程服务器返回错误:(404) 未找到。
所以我的问题是:
我使用S3 TransferUtility而不是使用 Write-S3Object对象,该对象能够使用分段上传来上传大文件。
我一直在使用下面的 powershell 脚本将文件上传到 S3。
function UploadToAmazonUsingSDK()
{
param([string] $sourceLocation, [string] $bucketName, [string] $versionNumber)
Add-Type -Path "C:\Program Files (x86)\AWS SDK for .NET\bin\Net45\AWSSDK.dll"
$AccessKey= "your aws accesskey"
$SecretKey ="your secret key"
$s3Config=New-Object Amazon.S3.AmazonS3Config
$s3Config.UseHttp = $false
$s3Config.ServiceURL = "https://s3-eu-west-1.amazonaws.com"
$s3Config.BufferSize = 1024 * 32
$client=[Amazon.AWSClientFactory]::CreateAmazonS3Client($AccessKey,$SecretKey,$s3Config)
$transferUtility = New-Object -TypeName Amazon.S3.Transfer.TransferUtility($client)
$files = Get-ChildItem $sourceLocation
foreach ($fileName in $files) {
$amazonKey = $versionNumber + '/' + $fileName
Write-Host $amazonKey
Write-Host $fileName
Write-Host $fileName.FullName
$transferUtilRequest = New-Object -TypeName Amazon.S3.Transfer.TransferUtilityUploadRequest
$transferUtilRequest.BucketName = $bucketName
$transferUtilRequest.FilePath = $fileName.FullName
$transferUtilRequest.Key = $amazonKey
$transferUtilRequest.AutoCloseStream = $true
$transferUtility.Upload($transferUtilRequest)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5721 次 |
| 最近记录: |