유니티에서 Amazon S3에 업로드할 때 PostObject를 사용하면 파일 업로드에 실패하는 문제



AWS에서는 유니티에서 AWS 기능들을 사용할 수 있게 해주는 SDK를 제공한다. (AWS에서 제공되는 유니티용 AWS SDK) 해당 SDK에는 AWS의 기능을 유니티에서 사용하는 방법에 대한 샘플 코드 역시 포함되어 있는데, 그 중에서 Amazon S3의 기능을 알려주는 샘플 코드에 문제가 있다.


해당 샘플 코드에서는 S3에 등록된 버킷의 목록을 가져오는 법, 버킷에 업로드된 오브젝트의 목록을 가져오는 법, 버킷에 있는 오브젝트를 내려받는 법, 버킷에 새로운 오브젝트를 업로드하는 법, 버킷에 있는 오브젝트를 삭제하는 법에 대한 코드들이 포함되어 있다. 예제를 실행시켜보면 대부분 잘 작동하지만, 버킷에 새로운 오브젝트를 업로드하는 코드만 유독 정상적으로 작동하지 않는다.


다음은 문제의 작동하지 않는 코드이다.


/// <summary>
/// Post Object to S3 Bucket.
/// </summary>
public void PostObject()
{
    ResultText.text = "Retrieving the file";

    string fileName = SampleFileName;
            
    var stream = new FileStream(Application.dataPath + "/" + fileName, FileMode.Open, FileAccess.Read, FileShare.Read);

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

    ResultText.text += "\nMaking HTTP post call";

    Client.PostObjectAsync(request, (responseObj) =>
    {
        if (responseObj.Exception == null)
        {
            ResultText.text += string.Format("\nobject {0} posted to bucket {1}", responseObj.Request.Key, responseObj.Request.Bucket);
        }
        else
        {
            ResultText.text += "\nException while posting the result object";
            ResultText.text += string.Format("\n receieved error {0}", responseObj.Response.HttpStatusCode.ToString());
        }
    });
}


해당 코드를 실행하면 파일이 Amazon S3에 업로드되어야 하지만 정확한 실패 원인이 나오지 않고 업로드에 실패한다. 아마존 측에서 제공한 API에 문제가 있을 것으로 추정된다. 유니티에서 Amazon S3에 파일을 업로드하기 위해서는 코드를 다음과 같이 변경하여야 한다.



/// <summary>
/// Put Object to S3 Bucket.
/// </summary>
public void PutObject()
{
    AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;

    ResultText.text = "Retrieving the file";

    string fileName = GetFileHelper();

    var stream = new FileStream(Application.persistentDataPath + Path.DirectorySeparatorChar + fileName, FileMode.Open, FileAccess.Read, FileShare.Read);

    ResultText.text += "\nCreating request object";
    var request = new PutObjectRequest()
    {
        BucketName = S3BucketName,
        Key = fileName,
        InputStream = stream,
        CannedACL = S3CannedACL.Private
    };

    ResultText.text += "\nMaking HTTP post call";
    Client.PutObjectAsync(request, (responseObj) =>
    {
        if (responseObj.Exception == null)
        {
            ResultText.text += string.Format("\nobject {0} puted to bucket {1}", responseObj.Request.Key, responseObj.Request.BucketName);
        }
        else
        {
            ResultText.text += "\nException while puting the result object";
            ResultText.text += string.Format("\n receieved error {0}", responseObj.Response.HttpStatusCode.ToString());
        }
    });
}


위의 코드와 같이 PostObject 대신에 PutObject를 사용해야 Amazon S3에 파일 업로드가 정상적으로 되는 것을 확인할 수 있다.




참고 :: http://blog.naver.com/PostView.nhn?blogId=oksk0302&logNo=220987070146

반응형

+ Recent posts