我正在尝试修复以下代码导致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属性会更好。我正在把这条流拉出来,相反。它仍然无法正常工作。
答案 0 :(得分:3)
流是否正确定位?检查asset.Position以确保将位置设置为流的开头。
asset.Seek(0, SeekOrigin.Begin);
修改强>
好的,更多的猜测(尽管我猜不到): (所有这一切都假设您仍然可以“手动”读取您的传入流)
只是为了测试,尝试使用TransferUtility上的一个更简单的上传方法 - 也许只需要一个文件路径字符串。如果可行,则可能在UploadRequest对象上设置其他属性。
如果您在UploadRequest对象上挂钩UploadProgressEvent,您是否有任何其他线索可以解决出错的问题?
我注意到UploadRequest的api既包含InputStream属性,也包含WithInputStream流畅的API。也许设置InputStream有一个错误?也许尝试使用.WithInputStream API
答案 1 :(得分:0)
您使用的是哪个流?您正在使用的流是否支持mark()和reset()方法。
可能在上传方法时首先计算给定流的MD5然后上传它,所以如果你的流不支持这两种方法,那么在MD5计算时它到达eof然后无法预先定位流上传对象。