Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取上载的s3对象.net的url_C#_Amazon S3_.net Core - Fatal编程技术网

C# 获取上载的s3对象.net的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

因此,目前我的代码将图像上传到S3,但我希望它现在要做的是获取已上传图像的URL,以便该URL可以存储在DB中,稍后使用

我知道这是可能的,正如这里的问题所示:(但那是JavaScript,我正在努力将其转换为c)

这是我的代码,它工作得很好,我只需要获得上传对象的URL+是否有一种方法可以在默认情况下公开该对象。我试着写回应,但没有帮助

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);
            }
        }
    }