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

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

上传文件:

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)
    {
        [...]
    }
}
}


获取文件:

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)
    {
        [...]
    }
}
}


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

我猜它正在做一些事情,我正在获得一个流,现在可以以某种方式立即准备将其再次上传?

这就是我尝试获取现有文件(.jpg)流并立即尝试使用其他文件名上载的方式:

newAWS.UploadFile(newFileName, oldAWS.GetFile(oldFile));


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

请让我知道,如果我在这里遗漏了一些明显的东西,为什么我将无法重新上传获取的流。还是它与我不知道的其他东西有关,并且我在尝试对返回的流进行故障排除的方向错误?

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

非常感谢您抽出宝贵的时间来研究我的代码:-)

最佳答案

如错误所示,Amazon返回Hashstreamdoes 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
}

10-08 16:22