c#.netcore获取amazon s3文件夹下所有文件的ImageURL
使用C#和amazon.Net core,可以列出amazon S3文件夹中URL路径的所有文件,如下所示:c#.netcore获取amazon s3文件夹下所有文件的ImageURL,c#,asp.net-core,amazon-s3,C#,Asp.net Core,Amazon S3,使用C#和amazon.Net core,可以列出amazon S3文件夹中URL路径的所有文件,如下所示: public async Task<string> GetMenuUrl(entities.Restaurant restaurant) { AmazonS3Client s3Client = new AmazonS3Client(_appSettings.AWSPublicKey, _appSettings.AWSPri
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;
}
当前正在输出的内容:
{
"menuUrl": "https://..bucketpath../System.String[]"
}
它应该输出两个ImageURL,而不是一个,而且它似乎输出的是列表类型而不是内容
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;
我已经在使用listobjectresponse您只使用了
listobjectresponse
,但没有使用它的任何属性。如果仔细阅读文档,您会注意到它有一个名为S3Objects
的属性,它是响应中返回的所有S3对象的集合。您需要循环浏览该集合,以获得关于每个集合的更多详细信息。您可以使用S3Object的Key属性和我共享的另一个链接来创建图像的url;
// 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;
[
{
"menuUrl" : "https://...bucketpath../test.jpg"
},
{
"menuUrl": "https://...bucketpath../test2.jpg"
},
]