如何使用.net web api c#在amzon s3上传图像?

时间:2017-07-31 07:44:43

标签: c# image asp.net-web-api amazon-s3

我为图片上传创建了一个api。在这个代码中,我上传时间图像下载在我的本地文件夹和商店。但我现在需要更改我的代码并在amzon s3上移动此图像下载。我在搜索时间中找到了一个链接,但在此链接静态图像上传我需要从文件上传控件进行图像浏览并在amzon服务器上下载。但怎么办呢我不知道。请任何人怎么做,然后请帮助我。下面列出了我的代码。并且还添加我在下面尝试此代码。

这是我上传图片的api方法:

[HttpPost]
[Route("FileUpload")]
public HttpResponseMessage FileUpload(string FileUploadType)
{            
try
{             
    var httpRequest = HttpContext.Current.Request;
    if (httpRequest.Files.Count > 0)
    {
        foreach (string file in httpRequest.Files)
        {
            var postedFile = httpRequest.Files[file];
            string fname = System.IO.Path.GetFileNameWithoutExtension(postedFile.FileName.ToString());
            string extension = Path.GetExtension(postedFile.FileName);
            Image img = null;
            string newFileName = "";

                newFileName = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".jpeg";
                string path = ConfigurationManager.AppSettings["ImageUploadPath"].ToString();
                string filePath = Path.Combine(path, newFileName);
                 SaveJpg(img, filePath);                                               
            return Request.CreateResponse(HttpStatusCode.OK, "Ok");
        }
    }                
}
catch (Exception ex)
{
    return ex;
}            
return Request.CreateResponse(HttpStatusCode.OK, "Ok");
}

这是我的保存图片api =>

public static void SaveJpg(Image image, string file_name, long compression = 60)
    {
        try
        {
            EncoderParameters encoder_params = new EncoderParameters(1);

            encoder_params.Param[0] = new EncoderParameter(
                System.Drawing.Imaging.Encoder.Quality, compression);

            ImageCodecInfo image_codec_info =
                GetEncoderInfo("image/jpeg");

            image.Save(file_name, image_codec_info, encoder_params);
        }
        catch (Exception ex)
        {                
        }
    }

我在服务器上使用静态图片上传尝试此代码=>

private string bucketName = "Xyz";
    private string keyName = "abc.jpeg";
    private string filePath = "C:\\Users\\I BALL\\Desktop\\image\\abc.jpeg";. // this image is store on server 
    public void UploadFile()
    {
        var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);

        try
        {
            PutObjectRequest putRequest = new PutObjectRequest
            {
                BucketName = bucketName,
                Key = keyName,
                FilePath = filePath,
                ContentType = "text/plain"
            };

            PutObjectResponse response = client.PutObject(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);
            }
        }
    }

这里我已经展示了我的代码,但我需要对我的代码进行处理,那么如何做到这一点请任何人知道如何做到这一点。

1 个答案:

答案 0 :(得分:1)

这可能为时已晚,但我就是这样做的:

简答:用于.Net的Amazon S3 SDK有一个名为“TransferUtility”的类,它接受一个Stream对象,因此只要您可以将文件转换为从抽象Stream类派生的任何类,就可以上传该文件。

长答案: httprequest发布的文件有一个inputStream属性,所以在你的foreach循环中:

var postedFile = httpRequest.Files[file];

如果展开此对象,它的类型为“HttpPostedFile”,因此您可以通过InputStream属性访问Stream:

以下是工作样本的一些片段:

//get values from the headers
HttpPostedFile postedFile = httpRequest.Files["File"]; 
//convert the posted file stream a to memory stream 
System.IO.MemoryStream target = new System.IO.MemoryStream();
postedFile.InputStream.CopyTo(target);
//the following static function is a function I built which accepts the amazon file key and also the object that will be uploaded to S3, in this case, a MemoryStream object
s3.WritingAnObject(fileKey, target);

S3是一个名为“S3Uploader”的类的实例,这里有一些可以让你前进的片段, 下面是一些需要的命名空间:

using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.S3.Transfer;

类构造函数:

    static IAmazonS3 client;
    static TransferUtility fileTransferUtility;

    public S3Uploader(string accessKeyId, string secretAccessKey,string bucketName)
    {
        _bucketName = bucketName;

        var credentials = new BasicAWSCredentials(accessKeyId, secretAccessKey);
        client = new AmazonS3Client(credentials, RegionEndpoint.USEast1);
        fileTransferUtility = new TransferUtility(client);
    }

请注意,我们使用BasicAWSCredentials类创建凭据,而不是直接将其传递给AmazonS3Client。然后我们使用fileTransferUtility类来更好地控制发送到S3的内容。以下是基于内存流的上传工作方式:

 public void WritingAnObject(string keyName, MemoryStream fileToUpload)
    {
        try
        {
            TransferUtilityUploadRequest fileTransferUtilityRequest = new 
            TransferUtilityUploadRequest
            {
                StorageClass = S3StorageClass.ReducedRedundancy,
                CannedACL = S3CannedACL.Private
            };
            fileTransferUtility.Upload(fileToUpload, _bucketName, keyName);
        }
        catch (AmazonS3Exception amazonS3Exception)
        {
            //your error handling here
        }
    }

希望这可以帮助有类似问题的人。