FileUpload到Amazon S3会产生0字节文件

时间:2012-11-29 18:49:20

标签: c# file-upload amazon-s3

我正在尝试修复以下代码导致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属性会更好。我正在把这条流拉出来,相反。它仍然无法正常工作。

2 个答案:

答案 0 :(得分:3)

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

asset.Seek(0, SeekOrigin.Begin);

修改

好的,更多的猜测(尽管我猜不到): (所有这一切都假设您仍然可以“手动”读取您的传入流)

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

  2. 如果您在UploadRequest对象上挂钩UploadProgressEvent,您是否有任何其他线索可以解决出错的问题?

  3. 我注意到UploadRequest的api既包含InputStream属性,也包含WithInputStream流畅的API。也许设置InputStream有一个错误?也许尝试使用.WithInputStream API

答案 1 :(得分:0)

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

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