fileTransferUtility = new TransferUtility(s3Client);
try
{
if (file.ContentLength > 0)
{
var filePath = Path.Combine(Server.MapPath("~/Files"), Path.GetFileName(file.FileName));
var fileTransferUtilityRequest = new TransferUtilityUploadRequest
{
BucketName = bucketName,
FilePath = filePath,
StorageClass = S3StorageClass.StandardInfrequentAccess,
PartSize = 6291456, // 6 MB.
Key = keyName,
CannedACL = S3CannedACL.PublicRead
};
fileTransferUtilityRequest.Metadata.Add("param1", "Value1");
fileTransferUtilityRequest.Metadata.Add("param2", "Value2");
fileTransferUtility.Upload(fileTransferUtilityRequest);
fileTransferUtility.Dispose();
}
我得到这个错误FilePath属性显示的文件不存在!我试着把文件的实际路径改成C:/Users/jojo/Downloads,但还是得到同样的错误。
我试着把文件的实际路径改为C:\Users\jojo\Downloads,但还是得到同样的错误。
(基于上面的评论,表明 file
是一个实例 HttpPostedFileBase
在网络应用中...)
我不知道你从哪里得到 Server.MapPath("~/Files")
从,但如果 file
是一个 HttpPostedFileBase
已经上传到这个网络应用程序的代码,那么它很可能在内存中,而不是在你的文件系统中。 或者最好是在文件系统中的某个临时系统文件夹中。
由于你的源码(即 file
变量内容)是一个流,在你尝试与文件系统交互之前,你应该看看你使用的AWS API是否可以接受一个流。 而现在看来是可以的。
if (file.ContentLength > 0)
{
var transferUtility = new TransferUtility(/* constructor params here */);
transferUtility.Upload(file.InputStream, bucketName, keyName);
}
注意,这完全是自由发挥,我对AWS的交互并不熟悉。 而且你一定要看一下在 TransferUtility
来看看哪个符合你的设计。 但问题是,你目前要上传的是一个 溪流 从您已经上传到您的Web应用程序的文件。不 寻找从文件系统上传一个实际的文件。
作为后备方案,如果你不能让流上传工作(你真的应该这样做,这是这里的理想方法),那么你的下一个选择很可能是先保存文件,然后用你现在的方法上传。 所以,如果你希望它在 Server.MapPath("~/Files")
那么你就需要先把它保存到那个文件夹里,比如说。
file.SaveAs(Path.Combine(Server.MapPath("~/Files"), Path.GetFileName(file.FileName)));
当然,随着时间的推移,这个文件夹可能会变得很满,你可能会想把它清理掉。