Amazon S3数据存储

从官网下载aws 的unity插件,并做了简单修改(主要用修改PostObject),问题:

(一)获取Pool ID

通过服务-Cognito-管理/新建用户池,可以新建或者获取Pool ID

(二)上传失败问题

使用unity插件中S3Example中PostObject时抛异常,但是获取GetObject没问题,此时需要在上传时代码中加一下区域,如下图所示。如果此时正在科学上网,请暂停科学上网,不允许通过代理访问(貌似是,本人报代理异常,改用VPN或者暂停科学上网代理即可)

 

 //----------------------------------------------代码--------------------------------------------------//

using UnityEngine;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.Runtime;
using System.IO;
using System;
using System.Collections.Generic;
using Amazon.CognitoIdentity;
using Amazon;

public class AmazonS3Sdk : MonoBehaviour
{
    public string IdentityPoolId = "";
    public string CognitoIdentityRegion = RegionEndpoint.APSoutheast1.SystemName;
    private RegionEndpoint _CognitoIdentityRegion
    {
        get { return RegionEndpoint.GetBySystemName(CognitoIdentityRegion); }
    }
    public string S3Region = RegionEndpoint.APSoutheast1.SystemName;
    private RegionEndpoint _S3Region
    {
        get { return RegionEndpoint.GetBySystemName(S3Region); }
    }
    public string S3BucketName = null;
    public string SampleFileName = null;

    void Start()
    {
        UnityInitializer.AttachToGameObject(this.gameObject);

        AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;
    }

    #region private members

    private IAmazonS3 _s3Client;
    private AWSCredentials _credentials;

    private AWSCredentials Credentials
    {
        get
        {
            if (_credentials == null)
                _credentials = new CognitoAWSCredentials(IdentityPoolId, _CognitoIdentityRegion);
            return _credentials;
        }
    }

    private IAmazonS3 Client
    {
        get
        {
            if (_s3Client == null)
            {
                _s3Client = new AmazonS3Client(Credentials, _S3Region);
            }
            //test comment
            return _s3Client;
        }
    }

    #endregion

    #region Get Bucket List
    /// <summary>
    /// Example method to Demostrate GetBucketList
    /// </summary>
    public void GetBucketList()
    {
        Debug.Log("Fetching all the Buckets");
        Client.ListBucketsAsync(new ListBucketsRequest(), (responseObject) =>
        {
            Debug.Log(responseObject.Exception.ToString());

            if (responseObject.Exception == null)
            {
                Debug.Log("Got Response");

                responseObject.Response.Buckets.ForEach((s3b) =>
                {
                    string info = string.Format("bucket = {0}, created date = {1} \n", s3b.BucketName, s3b.CreationDate);
                    Debug.Log(info);
                });
            }
            else
            {
                //ResultText.text += "Got Exception " + responseObject.Exception.ToString();
                Debug.Log("Fetching Buckets Exception:" + responseObject.Exception.ToString());

            }
        });
    }

    #endregion

    /// <summary>
    /// Get Object from S3 Bucket
    /// </summary>
    private void GetObject()
    {
        string info = string.Format("fetching {0} from bucket {1}", SampleFileName, S3BucketName);
        Debug.Log(info);

        Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) =>
        {
            string data = null;
            var response = responseObj.Response;
            if (response.ResponseStream != null)
            {
                using (StreamReader reader = new StreamReader(response.ResponseStream))
                {
                    data = reader.ReadToEnd();
                }

                Debug.Log(data);
                //ResultText.text += data;
            }
        });
    }

    /// <summary>
    /// Post Object to S3 Bucket. 
    /// </summary>
    public void PostObject(string file,string key,Action<string> action)
    {
        Debug.Log("Posting the file");
    
        var stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read);

        //ResultText.text += "\nCreating request object";
        var request = new PostObjectRequest()
        {
            Bucket = S3BucketName,
            //Key = fileName,
            Key = key,
            InputStream = stream,
            CannedACL = S3CannedACL.Private,
            Region = _S3Region
        };

        Debug.Log("Making HTTP post call");

        Client.PostObjectAsync(request, (responseObj) =>
        {
            if (responseObj.Exception == null)
            {
                string info = string.Format("\nobject {0} posted to bucket {1}", responseObj.Request.Key, responseObj.Request.Bucket);
                Debug.Log(info);

                if (action != null)
                    action(responseObj.Request.Key);
            }
            else
            {
                Debug.Log("Posting Exception:"+ responseObj.Exception.ToString());
                //ResultText.text += string.Format("\n receieved error {0}", responseObj.Response.HttpStatusCode.ToString());
            }
        });
    }

    /// <summary>
    /// Get Objects from S3 Bucket
    /// </summary>
    public void GetObjects()
    {
        Debug.Log("Fetching all the Objects from " + S3BucketName);

        var request = new ListObjectsRequest()
        {
            BucketName = S3BucketName
        };

        Client.ListObjectsAsync(request, (responseObject) =>
        {
            //ResultText.text += "\n";
            if (responseObject.Exception == null)
            {
                //ResultText.text += "Got Response \nPrinting now \n";
                responseObject.Response.S3Objects.ForEach((o) =>
                {
                    string info = string.Format("{0}\n", o.Key);
                    Debug.Log(info);
                });
            }
            else
            {
                string info = "Fetching Objects Exception:"+ responseObject.Exception.ToString();
                Debug.Log(info);
            }
        });
    }

    /// <summary>
    /// Delete Objects in S3 Bucket
    /// </summary>
    public void DeleteObject()
    {
        string info = string.Format("deleting {0} from bucket {1}", SampleFileName, S3BucketName);
        Debug.Log(info);
        List<KeyVersion> objects = new List<KeyVersion>();
        objects.Add(new KeyVersion()
        {
            Key = SampleFileName
        });

        var request = new DeleteObjectsRequest()
        {
            BucketName = S3BucketName,
            Objects = objects
        };

        Client.DeleteObjectsAsync(request, (responseObj) =>
        {
            //ResultText.text += "\n";
            if (responseObj.Exception == null)
            {
                //ResultText.text += "Got Response \n \n";

                //ResultText.text += string.Format("deleted objects \n");

                responseObj.Response.DeletedObjects.ForEach((dObj) =>
                {
                    string str = dObj.Key;
                    Debug.Log(str);
                });
            }
            else
            {
                string str = "Got Exception \n";
                Debug.Log(str);
            }
        });
    }

    private string GetFileHelper()
    {
        var fileName = SampleFileName;

        if (!File.Exists(Application.persistentDataPath + Path.DirectorySeparatorChar + fileName))
        {
            var streamReader = File.CreateText(Application.persistentDataPath + Path.DirectorySeparatorChar + fileName);
            streamReader.WriteLine("This is a sample s3 file uploaded from unity s3 sample");
            streamReader.Close();
        }
        return fileName;
    }

    private string GetPostPolicy(string bucketName, string key, string contentType)
    {
        bucketName = bucketName.Trim();

        key = key.Trim();
        // uploadFileName cannot start with /
        if (!string.IsNullOrEmpty(key) && key[0] == '/')
        {
            throw new ArgumentException("uploadFileName cannot start with / ");
        }

        contentType = contentType.Trim();

        if (string.IsNullOrEmpty(bucketName))
        {
            throw new ArgumentException("bucketName cannot be null or empty. It's required to build post policy");
        }
        if (string.IsNullOrEmpty(key))
        {
            throw new ArgumentException("uploadFileName cannot be null or empty. It's required to build post policy");
        }
        if (string.IsNullOrEmpty(contentType))
        {
            throw new ArgumentException("contentType cannot be null or empty. It's required to build post policy");
        }

        string policyString = null;
        int position = key.LastIndexOf('/');
        if (position == -1)
        {
            policyString = "{\"expiration\": \"" + DateTime.UtcNow.AddHours(24).ToString("yyyy-MM-ddTHH:mm:ssZ") + "\",\"conditions\": [{\"bucket\": \"" +
                bucketName + "\"},[\"starts-with\", \"$key\", \"" + "\"],{\"acl\": \"private\"},[\"eq\", \"$Content-Type\", " + "\"" + contentType + "\"" + "]]}";
        }
        else
        {
            policyString = "{\"expiration\": \"" + DateTime.UtcNow.AddHours(24).ToString("yyyy-MM-ddTHH:mm:ssZ") + "\",\"conditions\": [{\"bucket\": \"" +
                bucketName + "\"},[\"starts-with\", \"$key\", \"" + key.Substring(0, position) + "/\"],{\"acl\": \"private\"},[\"eq\", \"$Content-Type\", " + "\"" + contentType + "\"" + "]]}";
        }

        return policyString;
    }

}

 

下面为.Net的上传物体可用代码

  //private static readonly string awsAccessKey = "*****************";

        //private static readonly string awsSecretKey = "***************************";

        private static readonly string awsAccessKey = "**********************************";
        private static readonly string awsSecretKey = "**************************";

        private static readonly string bucketName = "************";
        //private static readonly string bucketName = "****************";

        static AmazonS3Config config = new AmazonS3Config()
        {
            ServiceURL = "http://s3.amazonaws.com"
        };

        static AmazonS3Client client;
        //static AmazonS3Client amazonS3Client;

        static void Main(string[] args)
        {
            //FileStream stream = File.OpenRead(args[0]);
            FileStream stream = File.OpenRead(@"D:\1107.jpg");
            //string resourcePath = @"D:\Demo\002.jpg";
            string info;
            //CreateBucket("test");
            //GetBucketList();
            //UploadbyPath(resourcePath);
            //Download(args[0]);
            using (AmazonS3Client amazonS3Client = new AmazonS3Client(awsAccessKey, awsSecretKey, config))
            {
                PutObjectRequest request = new PutObjectRequest()
                {
                    BucketName = bucketName,
                    //FilePath = args[0],
                    InputStream = stream,
                    CannedACL = S3CannedACL.PublicReadWrite,
                    Key = Path.GetFileName("123")
                    //ContentType = "text/plain"
                };

                try
                {
                    amazonS3Client.PutObject(request);
                    info = "success";
                    //amazonS3Client.Dispose();
                }
                catch (AmazonS3Exception ex)
                {
                    info = "failed:" + ex.Message;
                }

                //TransferUtility transfer = new TransferUtility(amazonS3Client);
                //transfer.Upload(path, bucketName, Path.GetFileName(path));
            }

            //stream.Close();
            //stream.Dispose();
            //amazonS3Client.Dispose();
            //return args[0];
            Console.WriteLine(info);
            Console.ReadKey();
        }

 

posted @ 2018-11-12 11:35  81192  阅读(1183)  评论(0编辑  收藏  举报