【问题标题】:S3FileInfo in Amazon S3 .NET SDK returning false alwaysAmazon S3 .NET SDK 中的 S3FileInfo 始终返回 false
【发布时间】:2018-04-26 11:32:47
【问题描述】:

我有一个简单的测试来验证我是否可以检查 S3 中是否存在文件。但是,当我使用S3FileInfo 类(建议检查存在)运行测试时,它将始终返回false。我添加了其他验证方法,以查看文件是否未正确上传,但确实如此。

测试

[Fact]
public void FileExists()
{
    var fileName = Guid.NewGuid().ToString() + "\\dummy\\path\\to\\file.txt";

    using (var client = clientFactory.GetClient())
    {
        var objectRequest = new PutObjectRequest();
        objectRequest.BucketName = config.BucketName;
        objectRequest.ContentBody = Guid.NewGuid().ToString();
        objectRequest.Key = fileName;

        var response = client.PutObject(objectRequest);
        Assert.Equal(HttpStatusCode.OK, response.HttpStatusCode);

        var request = new ListObjectsV2Request();
        request.BucketName = config.BucketName;

        var listResponse = client.ListObjectsV2(request);
        Assert.Equal(HttpStatusCode.OK, listResponse.HttpStatusCode);
        var contains = listResponse.S3Objects.Any(o => o.Key == fileName && o.BucketName == config.BucketName);
        Assert.True(contains);

        var putObject = listResponse.S3Objects.First(o => o.Key == fileName && o.BucketName == config.BucketName);
        Assert.Equal(config.BucketName, putObject.BucketName);
        Assert.Equal(fileName, putObject.Key);
        Assert.InRange(putObject.LastModified, DateTime.Now.AddMinutes(-1), DateTime.Now.AddMinutes(1));
        Assert.Equal(36, putObject.Size);

        var getResponse = client.GetObject(config.BucketName, fileName);
        Assert.Equal(HttpStatusCode.OK, getResponse.HttpStatusCode);
        Assert.Equal(config.BucketName, getResponse.BucketName);
        Assert.Equal(fileName, getResponse.Key);
        Assert.InRange(getResponse.LastModified.ToLocalTime(), DateTime.Now.AddMinutes(-1), DateTime.Now.AddMinutes(1));

        using (var responseStream = getResponse.ResponseStream)
        using (var reader = new StreamReader(responseStream))
        {
            var content = reader.ReadToEnd();
            Assert.Equal(objectRequest.ContentBody, content);
        }

        var info = new S3FileInfo(client, config.BucketName, fileName);
        Assert.True(info.Exists);
    }
}

此测试中的所有断言都通过 - 除了最后一个。我知道这不是 S3 中的延迟问题,因为之前的断言通过了。因此,我认为正在发生两件事之一:要么我对 S3FileInfo 类所做的事情有问题,要么我发现的 SDK 存在错误。我认为后者不太可能,但命令是如此简单,以至于我不知道我会如何做前者。我正在使用 .Net Amazon S3 SDK 的 3.3.12 版本。

更新:更新到 3.3.12.1 并没有解决问题。

【问题讨论】:

    标签: c# amazon-s3 sdk file-exists fileinfo


    【解决方案1】:

    当您从 Windows 上传到 S3 时,Amazon 会将反斜杠转换为正斜杠。

    https://forums.aws.amazon.com/thread.jspa?threadID=138263

    所以当你用ListObjectsV2 列出你的对象时,文件名将不存在。

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      相关资源
      最近更新 更多