【问题标题】:c# .netcore Get ImageURL of all files under amazon s3 folderc# .net core 获取amazon s3文件夹下所有文件的图片URL
【发布时间】:2020-11-05 08:57:18
【问题描述】:

使用 C# 和 amazon .Net core,能够列出 amazon S3 文件夹中的所有文件 URL 路径,如下所示:

       public async Task<string> GetMenuUrl(entities.Restaurant restaurant)
        {
            AmazonS3Client s3Client = new AmazonS3Client(_appSettings.AWSPublicKey, _appSettings.AWSPrivateKey, Amazon.RegionEndpoint.APSoutheast2);

            string imagePath;
            int restaurantId = restaurant.RestaurantId;
            ListObjectsRequest listRequest = new ListObjectsRequest();
            ListObjectsResponse listResponse; 

            imagePath = $"Business_menu/{restaurantId}/";
            listRequest.BucketName = _appSettings.AWSS3BucketName;
            listRequest.Prefix = imagePath;

            do
            {

                listResponse = await s3Client.ListObjectsAsync(listRequest);

            } while (listResponse.IsTruncated);


            var files = listResponse.S3Objects.Select(x => x.Key);
            
            var fileName = files.Select(x => Path.GetFileName(x)).ToList(); //outputs Test.jpg, Test2.jpg on this line

            var fileNameJoin = string.Join(", ", fileName); 

            var result = fileNameJoin.Split(); // contains 2 files Test.jpg, Test2.jpg

            //Need AWSS3BucketUrl for all files in imagePath 
            string imageUrl = $"{_appSettings.AWSS3BucketUrl}{imagePath}{result}";

            
            return imageUrl;
        }

 public async Task<MenuResponse> GetVenueMenuUrl(int restaurantId)
        {


            var restaurant = await _context.Restaurant.Where(w => w.RestaurantId == restaurantId).FirstOrDefaultAsync();

            var result = await _Service.GetMenuUrl(restaurant);

            
            var response = new MenuResponse()
            {
                MenuUrl = result
            };

            return response;
        }

我想按如下方式返回每个 imageurl:

 {
      menuUrl : "https://...bucketpath../test.jpg"
 },
 {
      menuUrl: "https://...bucketpath../test2.jpg"
 },

当前正在输出什么:

{
    "menuUrl": "https://..bucketpath../System.String[]"
}

它应该输出两个而不是一个 imageUrls,而且它似乎输出的是列表类型而不是内容。

【问题讨论】:

  • 我已经在使用 listobjectresponse
  • 您只使用了listobjectresponse,但没有使用它的任何属性。如果您仔细阅读文档,您会注意到它有一个名为 S3Objects 的属性,它是响应中返回的所有 S3 对象的集合。您需要遍历该集合以获取有关每个集合的更多详细信息。您可以使用 S3Object 的 Key 属性和我分享的其他链接来创建图像的 url。
  • 在这里使用它 var files = listResponse.S3Objects.Select(x => x.Key);

标签: c# asp.net-core amazon-s3


【解决方案1】:
string imageUrl = $"{_appSettings.AWSS3BucketUrl}{imagePath}{result}";

您告诉 C# 将字符串与“result”连接起来,但“result”不是字符串,而是数组。为了告诉编译器你真正想要什么,你需要从数组中取出单独的字符串并使用它们。

看起来您正在用我们看不到的代码将结果转换为 JSON。如果是这种情况,您可以尝试从函数返回对象列表而不是字符串,然后将其序列化为更接近预期输出的内容:

// make a simple class that will be serialized cleanly
public class MenuURL
{
    public string menuUrl;
}

// .... back in your function ....

List<MenuURL> URLs = new List<MenuURL>();

// Loop through your "results" variable
foreach (string str in result)
{
    MenuURL url = new MenuURL()
    {
        menuUrl = $"{_appSettings.AWSS3BucketUrl}{imagePath}{str}"
    };

    URLs.Add(url);
}

return URLs;

当您将返回的列表转换回 JSON 时,它应该看起来更像您想要的,即:

 [
     {
          "menuUrl" : "https://...bucketpath../test.jpg"
     },
     {
          "menuUrl": "https://...bucketpath../test2.jpg"
     },
 ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 2019-04-05
    • 2013-10-25
    • 2011-07-30
    • 1970-01-01
    • 2012-06-14
    • 2014-02-03
    • 2017-02-19
    相关资源
    最近更新 更多