C# 获取上载的s3对象.net的url
因此,目前我的代码将图像上传到S3,但我希望它现在要做的是获取已上传图像的URL,以便该URL可以存储在DB中,稍后使用 我知道这是可能的,正如这里的问题所示:(但那是JavaScript,我正在努力将其转换为c) 这是我的代码,它工作得很好,我只需要获得上传对象的URL+是否有一种方法可以在默认情况下公开该对象。我试着写回应,但没有帮助C# 获取上载的s3对象.net的url,c#,amazon-s3,.net-core,C#,Amazon S3,.net Core,因此,目前我的代码将图像上传到S3,但我希望它现在要做的是获取已上传图像的URL,以便该URL可以存储在DB中,稍后使用 我知道这是可能的,正如这里的问题所示:(但那是JavaScript,我正在努力将其转换为c) 这是我的代码,它工作得很好,我只需要获得上传对象的URL+是否有一种方法可以在默认情况下公开该对象。我试着写回应,但没有帮助 public class AmazonS3Uploader { private string bucketName = "cartalkio-ima
public class AmazonS3Uploader
{
private string bucketName = "cartalkio-image-storage-dev";
private string keyName = DateTime.Now.ToString() + ".png";
public async void UploadFile()
{
byte[] bytes = System.Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==");
Stream stream = new MemoryStream(bytes);
var myAwsAccesskey = "*************";
var myAwsSecret = "**************************";
var client = new AmazonS3Client(myAwsAccesskey, myAwsSecret, Amazon.RegionEndpoint.EUWest2);
try
{
PutObjectRequest putRequest = new PutObjectRequest
{
BucketName = bucketName,
Key = keyName,
ContentType = "image/png",
InputStream = stream
};
PutObjectResponse response = await client.PutObjectAsync(putRequest);
// Console.Write(response);
}
catch (AmazonS3Exception amazonS3Exception)
{
if (amazonS3Exception.ErrorCode != null &&
(amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
||
amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
{
throw new Exception("Check the provided AWS Credentials.");
}
else
{
throw new Exception("Error occurred: " + amazonS3Exception.Message);
}
}
}
我搜索了文档和各种网站,但我只找到了这些()-我想没有返回URL。我所做的只是稍微修改了一下我的代码,因为你总是可以根据你上传的对象的名称来预测对象的URL。i、 e如果您正在上载名为“test.png”的图像,则URL将如下所示: 我尝试了依赖注入,但AWS不喜欢这样,因此我将代码更改为: (在本例中,我接收一个base64字符串,将其转换为一个字节,然后转换为SYSTEM.IO.Stream) 这是我发出的请求:
{ "image":"iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
}
控制器:
public async Task<ActionResult> Index(string image)
{
AmazonS3Uploader amazonS3 = new AmazonS3Uploader();
// This bit creates a random string that will be used as part of the URL
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var stringChars = new char[8];
var random = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
var finalString = new String(stringChars);
// This bit adds the '.png' as its an image
var keyName = finalString + ".png";
// This uploads the file to S3, passing through the keyname (which is the end of the URL) and the image string
amazonS3.UploadFile(keyName, image);
// This is what the final URL of the object will be, so you can use this variable later or save it in your database
var itemUrl = "https://[your-bucket-name].s3.[S3-Region].amazonaws.com/" + keyName;
return Ok();
}
唯一的问题是,如果文件上传到S3失败,您可能仍然会得到URL,如果您正在将其保存到数据库中,您将把URL保存到数据库中,但对象不会存在于S3 bucket中,因此它不会出现在任何地方。如果您实现了依赖项注入-这不应该是一个问题(本例中未实现依赖项注入)如果字符串具有特殊字符,请不要忘记对其进行URL编码。事实上,我发现在“s3”之后有一个“-”(而不是“.”。所以
…s3-[s3区域]…
或$“https://{bucketName}.s3-{RegionEndpoint.USWest2.SystemName}.amazonaws.com/{HttpUtility.UrlEncode(key)}”
private string bucketName = "your-bucket-name";
public async void UploadFile(string keyName, string image)
{
byte[] bytes = System.Convert.FromBase64String(image);
Stream stream = new MemoryStream(bytes);
var myAwsAccesskey = "*************";
var myAwsSecret = "**************************";
var client = new AmazonS3Client(myAwsAccesskey, myAwsSecret, Amazon.RegionEndpoint.[S3-Region]);
try
{
PutObjectRequest putRequest = new PutObjectRequest
{
BucketName = bucketName,
Key = keyName,
ContentType = "image/png",
InputStream = stream
};
PutObjectResponse response = await client.PutObjectAsync(putRequest);
}
catch (AmazonS3Exception amazonS3Exception)
{
if (amazonS3Exception.ErrorCode != null &&
(amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
||
amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
{
throw new Exception("Check the provided AWS Credentials.");
}
else
{
throw new Exception("Error occurred: " + amazonS3Exception.Message);
}
}
}