使用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);   
            }   
        } 
+0

您收到的错误是什么? –

+0

@KhalidT。发生未处理的异常。异常类型:HttpException 异常消息:从客户端( lel

我终于解决了这个问题。我意识到我没有在AWSClientFactory中放置区域,在按键后面的末尾。

你得到的错误,由于DateTime.Now.ToBinary()包含在URL中使用无效字符。例如,您可以使用GUID或Unix时间戳。

此外,您分配给PutObjectRequestFilePath属性是要上载文件的完整路径和名称。所以,当你已经有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); 
} 
. 
. 
. 
+0

我有file.InputStream错误。不能将类型'System.IO.Stream'隐式转换为'System.IO.FileStream'。显示转换存在(你是否缺少一个转换? – lel

+0

由于错误,我更改为流而不是文件流运行它,它仍然失败 – lel

+0

请参阅我更新的Unix时间戳和file.InputStream的答案 –