【问题标题】:FileUpload to Amazon S3 results in 0 byte fileFileUpload 到 Amazon S3 生成 0 字节文件
【发布时间】:2012-11-17 22:19:55
【问题描述】:

我正在尝试修复以下代码在 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 属性会更好。相反,我现在正在从中拉出流。还是不行。

【问题讨论】:

  • 流的位置是什么?您可能需要将位置重置为零。

标签: c# file-upload amazon-s3


【解决方案1】:

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

asset.Seek(0, SeekOrigin.Begin);

编辑

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

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

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

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

【讨论】:

  • 我试过这样做,但没有结果。自从切换到 PostedFile 属性后,我还没有尝试过重置位置,但现在会尝试。
  • 你的猜测并不完全正确,但它们确实让我走上了正确的道路。事实证明,在大多数情况下,上传会在同一个文件上被调用两次。这似乎是问题的原因。更改我的代码以使上传只发生一次已解决问题。
  • 我很高兴你知道了!感谢您的回答投票!
【解决方案2】:

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

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

【讨论】:

  • 我正在使用包含 FileUpload 控件中的文件的 Stream。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 2012-12-12
  • 2012-09-11
  • 2012-01-11
  • 2012-04-16
  • 2016-10-30
相关资源
最近更新 更多