在两个AWS桶之间复制 - 从AWS返回的流:HashStream不支持搜索

jrn*_*jrn 1 c# stream amazon-web-services

我正在尝试重新上传刚刚检索到的流.我使用AWS并不重要我相信......也许我对使用流的理解太有限了?:-)

我直接从AWS文档中使用以下方法来下载和上传流:

上传文件:

public bool UploadFile(string keyName, Stream stream)
{
using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
{
    try
    {
        TransferUtility fileTransferUtility = new TransferUtility(new AmazonS3Client(Amazon.RegionEndpoint.USEast1));

        fileTransferUtility.Upload(stream, bucketName, keyName);

        return true;
    }
    catch (AmazonS3Exception amazonS3Exception)
    {
        [...]
    }
}
}
Run Code Online (Sandbox Code Playgroud)

获取文件:

public Stream GetFile(string keyName)
{    
using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast2))
{
    try
    {
        GetObjectRequest request = new GetObjectRequest
        {
            BucketName = bucketName,
            Key = keyName
        };

        GetObjectResponse response = client.GetObject(request);
        responseStream = response.ResponseStream;

        return responseStream;
    }
    catch (AmazonS3Exception amazonS3Exception)
    {
        [...]
    }
}
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试将这两种方法结合起来:我正在获取一个流并立即想要再次上传它.但是,我收到以下错误消息:System.NotSupportedException : HashStream does not support seeking

我猜它有事要做,我得到一个流,现在不知何故立即准备再次上传?

这就是我试图获取现有文件(.jpg)的流并立即尝试使用不同的文件名上传它的方式:

newAWS.UploadFile(newFileName, oldAWS.GetFile(oldFile));
Run Code Online (Sandbox Code Playgroud)

newAWS和oldAWS是AWS类的实例,newFileName是字符串:-)这是我收到上面粘贴的错误消息的行.

如果我遗漏了一些明显的原因,请告诉我为什么我无法重新上传获取的流.或者它是否与我不知道的其他东西有关,我在错误的轨道上尝试对返回的流进行故障排除?

我基本上要做的是使用流将一个文件从AWS桶复制到另一个.但由于某种原因,我收到错误消息,试图上传刚刚下载的流.

非常感谢你花时间挖掘我的代码:-)

Dou*_*g S 6

如错误所示,Hashstream亚马逊返回的对象does not support seeking.

您的代码中的某些内容或您正在调用的方法正试图在该流上进行搜索.最有可能的是它试图寻找流的开头.

所以你需要转换Hashstream为支持搜索的不同流:

using (GetObjectResponse response = client.GetObject(request))
using (Stream responseStream = response.ResponseStream)
using (MemoryStream memStream = new MemoryStream())
{
    responseStream.CopyTo(memStream);
    memStream.Seek(0, SeekOrigin.Begin);

    // now use memStream wherever you were previously using responseStream
}
Run Code Online (Sandbox Code Playgroud)


jrn*_*jrn 0

看来我的方法行不通,而且我不太确定为什么行不通。好消息是,您只需使用以下代码即可从一个 AWS 存储桶复制到另一个存储桶:

static IAmazonS3 client;
client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);

CopyObjectRequest request = new CopyObjectRequest()
{
    SourceBucket      = bucketName,
    SourceKey         = objectKey,
    DestinationBucket = bucketName,
    DestinationKey    = destObjectKey
};
CopyObjectResponse response = client.CopyObject(request);
Run Code Online (Sandbox Code Playgroud)

因此,我不必尝试使用我编写的上传和下载方法重新创建此功能,而只需使用提供的复制方法即可。

但是,我仍然想知道为什么我的方法失败了?我真的认为我错过了一些关于流的东西。任何反馈将不胜感激:-)

我不会回答这个问题,因为我真的很想知道我在流方面缺少什么。我很乐意将答案标记为已接受,以解释我缺失的知识:-)