将文件从amazon s3帐户传输到另一个帐户
本文关键字:传输 另一个 s3 文件 amazon | 更新日期: 2023-09-27 18:10:01
我正在编写一个应用程序,我们需要在不同的s3帐户之间传输文件,我们不想在上传到目标s3帐户之前将文件保存在本地。
因此,我们使用以下命令获取源文件流:
public Stream GetFileStream(string path)
{
var pathPieces = path.Split('/');
string bucket = pathPieces[0];
string fileName = pathPieces[pathPieces.Length - 1];
GetObjectRequest request = new GetObjectRequest();
request.BucketName = bucket;
request.Key = fileName;
GetObjectResponse response = Client.GetObject(request);
return response.ResponseStream;
}
之后,我们使用这个流上传到目的地:
TransferUtility transferUtility = new TransferUtility(Client);
transferUtility.S3Client.PutBucket(new PutBucketRequest() { UseClientRegion = true }.WithBucketName(bucket));
TransferUtilityUploadRequest request = new TransferUtilityUploadRequest()
.WithBucketName(bucket)
.WithKey(key)
.WithPartSize(1024)
.WithTimeout(100 * 60 * 60 * 1000)
.WithAutoCloseStream(true)
.WithCannedACL(S3CannedACL.PublicReadWrite)
.WithInputStream(fileStream) as TransferUtilityUploadRequest;
transferUtility.Upload(request);
但是在最后一行"上传"函数调用我总是得到这个错误:
是否有不同的方法来做我正在尝试做的事情?因为它的拼接方式不对
我遇到了这个问题,并发布了我用来解决它的方法。从乔恩·斯基特那里借了些代码。它对我有用,但我知道它有点笨拙,可能还可以改进。
string filename = "nameoffiletocopy"
using (Stream stream = GetS3Stream(filename))
{
AmazonS3Config config = new AmazonS3Config
{CommunicationProtocol = Protocol.HTTP};
AmazonS3 client =
AWSClientFactory.CreateAmazonS3Client(
"destinationaccesskey",
"destinationsecretacceskey",
config);
string destinationBucketName = "destinationbucketname";
PutObjectRequest request = new PutObjectRequest
{
BucketName = destinationBucketName,
InputStream = stream,
Key = filename,
CannedACL = S3CannedACL.PublicRead
};
PutObjectResponse response = client.PutObject(request);
}
private static Stream GetS3Stream(string filename)
{
AmazonS3Config config = new AmazonS3Config
{CommunicationProtocol = Protocol.HTTP};
AmazonS3 client = AWSClientFactory.CreateAmazonS3Client(
"sourceaccesskey",
"sourcesecretacceskey",
config);
string sourceBucketName = "sourcebucketname";
GetObjectRequest request = new GetObjectRequest
{
BucketName = sourceBucketName,
Key = filename
};
using (GetObjectResponse response = client.GetObject(request))
{
byte[] binaryData =
ReadFully(response.ResponseStream, -1);
//ReadyFully from Jon Skeet's blog
return new MemoryStream(binaryData);
}
}
readfull方法的详细解释
我真的不认为有办法在账户之间转账。我所知道的唯一能做到这一点的协议是FXP。您可以在将来向AWS请求这样做,这将是一个很好的功能。
Amazon有一个复制对象请求
AmazonS3Client client = new AmazonS3Client();
CopyObjectRequest request = new CopyObjectRequest {
SourceBucket = "fromBucket",
SourceKey = "fromFile",
DestinationBucket = "toBucket",
DestinationKey = "toFilename",
CannedACL = S3CannedACL.BucketOwnerFullControl
};
CopyObjectResponse response = client.CopyObject(request);