3

我正在尝试修复以下代码导致 S3 上的 0 字节文件且没有错误消息的错误。

此代码以 Stream(来自名称不佳的 FileUpload4)的形式提供,其中包含图像和所需的图像路径(来自数据库包装器对象)到 Amazon 的 S3,但文件本身从未上传。

CloudUtils.UploadAssetToCloud(FileUpload4.FileContent, ((ImageContent)auxSRC.Content).PhysicalLocationUrl);
ContentWrapper.SaveOrUpdateAuxiliarySalesRoleContent(auxSRC);

第二行只是保存数据库对象,该对象存储有关(假定)上传的图片的信息。此保存正在进行,表明上述行运行没有错误。

在检索到适当的存储桶名称后,上面的第一行调用此方法:

public static bool UploadAssetToCloud(Stream asset, string path, string bucketName, AssetSecurity security = AssetSecurity.PublicRead)
{
    TransferUtility txferUtil;
    S3CannedACL ACL = GetS3ACL(security);

    using (txferUtil = new Amazon.S3.Transfer.TransferUtility(AWSKEY, AWSSECRETKEY))
    {
        TransferUtilityUploadRequest request = new TransferUtilityUploadRequest()
            .WithBucketName(bucketName)
            .WithTimeout(TWO_MINUTES)
            .WithCannedACL(ACL)
            .WithKey(path);
        request.InputStream = asset;
        txferUtil.Upload(request);
    }

    return true;
}

我已经确保流是一个好的流 - 我可以将它保存在我有权限的任何其他地方,存储桶存在并且路径很好(文件是在 S3 上的目的地创建的,它只是没有填充流的内容)。我已经接近我的智慧了,在这里 - 我错过了什么?

编辑:我的一位同事指出,FileUpload 的 PostedFile 属性会更好。相反,我现在正在从中拉出流。它仍然无法正常工作。

4

2 回答 2

3

流的位置是否正确?检查asset.Position 以确保将位置设置为流的开头。

asset.Seek(0, SeekOrigin.Begin);

编辑

好的,更多的猜测(不过我只能猜测):(所有这些都假设你仍然可以“手动”从传入的流中读取)

  1. 只是为了测试,在 TransferUtility 上尝试一种更简单的 Upload 方法——也许一种只需要一个文件路径字符串的方法。如果可行,那么可能需要在 UploadRequest 对象上设置其他属性。

  2. 如果您将 UploadProgressEvent 挂接到 UploadRequest 对象上,您是否会得到任何其他线索来说明发生了什么问题?

  3. 我注意到 UploadRequest 的 api 包括 InputStream 属性和 WithInputStream fluent API。也许设置 InputStream 有一个错误?也许尝试使用 .WithInputStream API

于 2012-12-03T19:06:47.647 回答
0

您正在使用哪个流?您正在使用的流是否支持 mark() 和 reset() 方法。

可能是上传方法首先计算给定流的MD5然后上传,所以如果你的流不支持这两种方法,那么在计算MD5时它会到达eof,然后无法为流上传预置位目的。

于 2012-11-30T06:35:19.927 回答