使用AWS SDK将文件上传到S3 ASP.NET
问题描述:
我想将图像从ASP.NET上传到S3。我正在使用AWS SDK,并且已经设置了所需的东西。但是,我运行我的项目后,我收到一个错误。对于此示例代码,我将替换我的存储桶名称。使用AWS SDK将文件上传到S3 ASP.NET
我在Web.config中设置了我的secretkey和accesskey。请告诉我,如果你需要更多的代码。我需要帮助。
控制器
private static readonly string _awsAccessKey = ConfigurationManager.AppSettings["AWSAccessKey"];
private static readonly string _awsSecretKey = ConfigurationManager.AppSettings["AWSSecretKey"];
[HttpPost]
public ActionResult UploadFile(HttpPostedFileBase file)
{
try
{
if (file.ContentLength > 0)
{
IAmazonS3 client;
using (client = Amazon.AWSClientFactory.CreateAmazonS3Client(_awsAccessKey, _awsSecretKey))
{
PutObjectRequest request = new PutObjectRequest
{
BucketName = "...",
CannedACL = S3CannedACL.PublicRead,
Key = "images/" + (DateTime.Now.ToBinary() + "-" + file.FileName),
FilePath = Server.MapPath("~/UploadedFiles")
};
client.PutObject(request);
}
}
imageUrls = "File Uploaded Successfully!!";
System.Diagnostics.Debug.WriteLine("File Uploaded Successfully!!");
return Json(imageUrls);
}
catch
{
ViewBag.Message = "File upload failed!!";
System.Diagnostics.Debug.WriteLine("File upload failed!!");
return Json(ViewBag.Message);
}
}
答
我终于解决了这个问题。我意识到我没有在AWSClientFactory中放置区域,在按键后面的末尾。
答
你得到的错误,由于DateTime.Now.ToBinary()
包含在URL中使用无效字符。例如,您可以使用GUID或Unix时间戳。
此外,您分配给PutObjectRequest
的FilePath
属性是要上载文件的完整路径和名称。所以,当你已经有HttpPostedFileBase
作为输入参数时,你不需要它,它包含InputStream
属性(即流对象)。
你PutObjectRequest
应该是这个样子:
.
.
.
Guid guid = Guid.NewGuid();
// Create a client
AmazonS3Client client = new AmazonS3Client(_awsAccessKey, _awsSecretKey);
// Create a PutObject request
PutObjectRequest request = new PutObjectRequest
{
BucketName = "...",
CannedACL = S3CannedACL.PublicRead,
Key = "images/" + guid + "-" + file.FileName
};
using (System.IO.Stream inputStream = file.InputStream)
{
request.InputStream = inputStream;
// Put object
PutObjectResponse response = client.PutObject(request);
}
.
.
.
您收到的错误是什么? –
@KhalidT。发生未处理的异常。异常类型:HttpException 异常消息:从客户端( lel