web-dev-qa-db-ja.com

AndroidからAmazonS3に画像をアップロードしますか?

ビットマップをAmazonS3にアップロードする必要があります。私はS3を使用したことがありませんが、この特定の要件をカバーするものが何も見当たらないため、ドキュメントはあまり役に立たないことが証明されています。残念ながら、私はこのプロジェクトですべてがどのように連携するかを学ぶために1日を費やす時間を見つけるのに苦労しているので、親切な人の1人が私にいくつかの指針を与えてくれることを願っています。

ファイルをS3にプッシュし、代わりにURL参照を取得する方法を説明する参照のソースを教えていただけますか?

具体的には:-S3を使用する場合の認証情報の行き先Android SDK?-ファイルをアップロードする前にバケットを作成する必要がありますか、それともバケットの外部に存在できますか?-どのSDKメソッドを使用しますか?私はビットマップをS3までプッシュするために使用しますか?-必要なことを実行するにはCOREおよびS3ライブラリが必要であり、他には必要ないと考えるのは正しいですか?

15
Ollie C

Amazon S3 APIドキュメント を見て、AmazonS3で実行できることと実行できないことの感触をつかんでください。 2つのAPIがあることに注意してください。より単純なREST APIとより複雑なSOAP APIです。

独自のコードを記述して、HTTPリクエストを作成してREST APIとやり取りするか、SOAPライブラリを使用してSOAP API。すべてのAmazonサービスにはこれらの標準APIエンドポイント(REST、SOAP)があり、理論的には任意のプログラミング言語でクライアントを作成できます。

幸いなことに、Android開発者のために、Amazonは ベータ)SDK をリリースしました。これは、このすべての作業を行います。 はじめに ガイドがあります。および Javadocs も。このSDKを使用すると、S3をアプリケーションと数時間で統合できるはずです。

スタートガイドには完全なサンプルが付属しており、必要な資格情報を提供する方法が示されています。

概念的には、Amazon S3はデータをバケットに保存します。バケットにはオブジェクトが含まれます。通常、アプリケーションごとに1つのバケットを使用し、必要な数のオブジェクトを追加します。 S3はフォルダーをサポートしていないか、フォルダーの概念を持っていませんが、オブジェクト名にスラッシュ(/)を入れることができます。

8
String      ACCESS_KEY="****************",
            SECRET_KEY="****************",
            MY_BUCKET="bucket_name",
            OBJECT_KEY="unique_id";              
  AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
                AmazonS3 s3 = new AmazonS3Client(credentials);
                Java.security.Security.setProperty("networkaddress.cache.ttl" , "60");
                s3.setRegion(Region.getRegion(Regions.AP_SOUTHEAST_1));
                s3.setEndpoint("https://s3-ap-southeast-1.amazonaws.com/");
                List<Bucket> buckets=s3.listBuckets();
                for(Bucket bucket:buckets){
                    Log.e("Bucket ","Name "+bucket.getName()+" Owner "+bucket.getOwner()+ " Date " + bucket.getCreationDate());
                }
                Log.e("Size ", "" + s3.listBuckets().size());
                TransferUtility transferUtility = new TransferUtility(s3, getApplicationContext());
                UPLOADING_IMAGE=new File(Environment.getExternalStorageDirectory().getPath()+"/Screenshot.png");
                TransferObserver observer = transferUtility.upload(MY_BUCKET,OBJECT_KEY,UPLOADING_IMAGE);
                observer.setTransferListener(new TransferListener() {
                    @Override
                    public void onStateChanged(int id, TransferState state) {
                        // do something
                        progress.hide();
                        path.setText("ID "+id+"\nState "+state.name()+"\nImage ID "+OBJECT_KEY);

                    }

                    @Override
                    public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
                        int percentage = (int) (bytesCurrent / bytesTotal * 100);
                        progress.setProgress(percentage);
                        //Display percentage transfered to user
                    }

                    @Override
                    public void onError(int id, Exception ex) {
                        // do something
                        Log.e("Error  ",""+ex );
                    }

                });
10
Andan H M

「Amazones3」バケットを直接使用して、あらゆるタイプのファイルをサーバーに保存できます。また、Apiサーバーにファイルを送信する必要がないため、リクエスト時間が短縮されます。

Gradleファイル:-

 compile 'com.amazonaws:aws-Android-sdk-core:2.2.+'
    compile 'com.amazonaws:aws-Android-sdk-s3:2.2.+'
    compile 'com.amazonaws:aws-Android-sdk-ddb:2.2.+'

マニフェストファイル:-

<service Android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
            Android:enabled="true" />

任意のクラスのFileUploader関数:-

 private void setUPAmazon() {
 //we Need Identity Pool ID  like :- "us-east-1:f224****************8"
        CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(getActivity(),
                "us-east-1:f224****************8", Regions.US_EAST_1);
        AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
        final TransferUtility transferUtility = new TransferUtility(s3, getActivity());
        final File file = new File(mCameraUri.getPath());
        final TransferObserver observer = transferUtility.upload(GeneralValues.Amazon_BUCKET, file.getName(), file, CannedAccessControlList.PublicRead);
        observer.setTransferListener(new TransferListener() {
            @Override
            public void onStateChanged(int id, TransferState state) {
                Log.e("onStateChanged", id + state.name());
                if (state == TransferState.COMPLETED) {
                    String url = "https://"+GeneralValues.Amazon_BUCKET+".s3.amazonaws.com/" + observer.getKey();
                    Log.e("URL :,", url);
//we just need to share this File url with Api service request.  
                }
            }

            @Override
            public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
            }

            @Override
            public void onError(int id, Exception ex) {
                Toast.makeText(getActivity(), "Unable to Upload", Toast.LENGTH_SHORT).show();
                ex.printStackTrace();
            }
        });
    }
1
A-Droid Tech

s3Amazonで画像をアップロードおよびダウンロードできます。このWebserviceAmazonを使用して単純なクラスを作成します

public class WebserviceAmazon extends AsyncTask<Void, Void, Void> {
private String mParams;
private String mResult = "x";
WebServiceInterface<String, String> mInterface;
private int mRequestType;
private  String UserId;
private Context mContext;


public WebserviceAmazon(Context context,String imagePath,String AppId,int type) {
    this.mContext = context;
    this.mParams = imagePath;
    this.mRequestType = type;
    this.UserId = AppId;
}

public void result(WebServiceInterface<String, String> myInterface) {
    this.mInterface = myInterface;
}

@Override
protected Void doInBackground(Void... params) {
    String ACCESS_KEY ="abc..";
    String SECRET_KEY = "klm...";

    try {
        if (mRequestType == 1) { // POST
            AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY));
            PutObjectRequest request = new PutObjectRequest("bucketName", "imageName", new File(mParams));
            s3Client.putObject(request);

            mResult = "success";
        } if (mRequestType == 2) { // For get image data
            AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY));
            S3Object object = s3Client.getObject(new GetObjectRequest("bucketName", mParams));
            S3ObjectInputStream objectContent = object.getObjectContent();
            byte[] byteArray = IOUtils.toByteArray(objectContent);

           Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);



            mResult = "success";
        }

    } catch (Exception e) {
        mResult = e.toString();
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
}

@Override
protected void onPostExecute(Void result) {
    // TODO Auto-generated method stub
  super.onPostExecute(result);
    mInterface.success(this.mResult);

}

public interface WebServiceInterface<E, R> {
    public void success(E reslut);

    public void error(R Error);
}

}

プロジェクト内の任意の場所でこのWebサービスを呼び出す

    WebserviceAmazon Amazon = new WebserviceAmazon(getActivity(), imageName, "", 2);
    Amazon.result(new WebserviceAmazon.WebServiceInterface<String, String>() {
        @Override
        public void success(String reslut) {

        }

        @Override
        public void error(String Error) {

        }
    });

    return totalPoints;
}
0
Binesh Kumar

S3UploadServiceというライブラリを使用できます。まず、ビットマップをファイルに変換する必要があります。これを行うには、この投稿を見てください:

ビットマップをファイルに変換

S3UploadServiceは、AmazonS3へのアップロードを処理するライブラリです。 S3UploadServiceと呼ばれるサービスに、コンテキスト(静的メソッドがサービスを開始できるようにする)、ファイル、アップロード完了後にファイルを削除するかどうかを示すブール値を提供する静的メソッドを提供し、オプションでコールバックを設定できます(ただし、通常のコールバックと同様です。これが機能する方法は、READMEファイル)で説明されています。

これはIntentServiceであるため、アップロード中にユーザーがアプリを強制終了した場合でもアップロードが実行されます(そのライフサイクルはアプリのライフサイクルに関連付けられていないため)。

このライブラリを使用するには、マニフェストでサービスを宣言する必要があります。

<application
    ...>

    ...

    <service
        Android:name="com.onecode.s3.service.S3UploadService"
        Android:exported="false" />
</application>

次に、S3BucketDataインスタンスを作成し、S3UploadService.upload()を呼び出します。

    S3Credentials s3Credentials = new S3Credentials(accessKey, secretKey, sessionToken);
    S3BucketData s3BucketData = new S3BucketData.Builder()
            .setCredentials(s3Credentials)
            .setBucket(bucket)
            .setKey(key)
            .setRegion(region)
            .build();

    S3UploadService.upload(getActivity(), s3BucketData, file, null);

このライブラリを追加するには、JitPackリポジトリをルートbuild.gradleに追加する必要があります。

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

次に、依存関係を追加します。

dependencies {
    compile 'com.github.OneCodeLabs:S3UploadService:1.0.0@aar'
}

リポジトリへのリンクは次のとおりです: https://github.com/OneCodeLabs/S3UploadService

この答えは少し遅れていますが、誰かに役立つことを願っています

0

下記のクラスを使用して、Amazons3バケットにデータをアップロードできます。

public class UploadAmazonS3{

private CognitoCachingCredentialsProvider credentialsProvider = null;
private AmazonS3Client s3Client = null;
private TransferUtility transferUtility = null;
private static UploadAmazonS3 uploadAmazonS3;

/**
 * Creating single tone object by defining private.
 * <P>
 *     At the time of creating
 * </P>*/
private UploadAmazonS3(Context context, String canito_pool_id)
{
    /**
     * Creating the object of the getCredentialProvider object. */
    credentialsProvider=getCredentialProvider(context,canito_pool_id);
    /**
     * Creating the object  of the s3Client */
    s3Client=getS3Client(context,credentialsProvider);

    /**
     * Creating the object of the TransferUtility of the Amazone.*/
    transferUtility=getTransferUtility(context,s3Client);

}

public static UploadAmazonS3 getInstance(Context context, String canito_pool_id)
{
    if(uploadAmazonS3 ==null)
    {
        uploadAmazonS3 =new UploadAmazonS3(context,canito_pool_id);
        return uploadAmazonS3;
    }else
    {
        return uploadAmazonS3;
    }

}

/**
 * <h3>Upload_data</h3>
 * <P>
 *     Method is use to upload data in the amazone server.
 *
 * </P>*/

public void uploadData(final String bukkate_name, final File file, final Upload_CallBack callBack)
{
    Utility.printLog("in Amazon upload class uploadData "+file.getName());

    if(transferUtility!=null&&file!=null)
    {
        TransferObserver observer=transferUtility.upload(bukkate_name,file.getName(),file);
        observer.setTransferListener(new TransferListener()
        {
            @Override
            public void onStateChanged(int id, TransferState state)
            {
                if(state.equals(TransferState.COMPLETED))
                {
                    callBack.sucess(com.tarha_taxi.R.string.Amazon_END_POINT_LINK+bukkate_name+"/"+file.getName());
                }
            }

            @Override
            public void onProgressChanged(int id, long bytesCurrent, long bytesTotal)
            {

            }
            @Override
            public void onError(int id, Exception ex)
            {
                callBack.error(id+":"+ex.toString());

            }
        });
    }else
    {
        callBack.error("Amamzones3 is not intialize or File is empty !");
    }
}

/**
 * This method is used to get the CredentialProvider and we provide only context as a parameter.
 * @param context Here, we are getting the context from calling Activity.*/
private CognitoCachingCredentialsProvider getCredentialProvider(Context context,String pool_id)
{
    if (credentialsProvider == null)
    {
        credentialsProvider = new CognitoCachingCredentialsProvider(
                context.getApplicationContext(),
                pool_id, // Identity Pool ID
                Amazon_REGION // Region
        );
    }
    return credentialsProvider;
}

/**
 * This method is used to get the AmazonS3 Client
 * and we provide only context as a parameter.
 * and from here we are calling getCredentialProvider() function.
 * @param context Here, we are getting the context from calling Activity.*/
private AmazonS3Client getS3Client(Context context,CognitoCachingCredentialsProvider cognitoCachingCredentialsProvider)
{
    if (s3Client == null)
    {
        s3Client = new AmazonS3Client(cognitoCachingCredentialsProvider);
        s3Client.setRegion(Region.getRegion(Amazon_REGION));
        s3Client.setEndpoint(context.getString(com.tarha_taxi.R.string.Amazon_END_POINT_LINK));
    }
    return s3Client;
}

/**
 * This method is used to get the Transfer Utility
 * and we provide only context as a parameter.
 * and from here we are, calling getS3Client() function.
 * @param context Here, we are getting the context from calling Activity.*/
private TransferUtility getTransferUtility(Context context,AmazonS3Client amazonS3Client)
{
    if (transferUtility == null)
    {
        transferUtility = new TransferUtility(amazonS3Client,context.getApplicationContext());
    }
    return transferUtility;
}

/**
 * Interface for the sucess callback fro the Amazon uploading .
 * */
public interface Upload_CallBack
{
    /**
     *Method for sucess .
     * @param sucess it is true on sucess and false for falure.*/
    void sucess(String sucess);
    /**
     * Method for falure.
     * @param errormsg contains the error message.*/
    void error(String errormsg);

}

}

上記の計算にアクセスするには、以下の方法を使用してください。

 private void uploadToAmazon() {
    dialogL.show();
    UploadAmazonS3 amazonS3 = UploadAmazonS3.getInstance(getActivity(), getString(R.string.Amazon_POOL_ID));
    amazonS3.uploadData(getString(R.string.BUCKET_NAME), Utility.renameFile(VariableConstants.TEMP_PHOTO_FILE_NAME, phone.getText().toString().substring(1) + ".jpg"), new UploadAmazonS3.Upload_CallBack() {
        @Override
        public void sucess(String sucess) {
            if (Utility.isNetworkAvailable(getActivity())) {
                dialogL.dismiss();
                /**
                 * to set the image into image view and
                 * add the write the image in the file
                 */
                activity.user_image.setTag(setTarget(progress_bar));
                Picasso.with(getActivity()).load(getString(R.string.Amazon_IMAGE_LINK) + phone.getText().toString().substring(1) + ".jpg").
                        networkPolicy(NetworkPolicy.NO_CACHE).memoryPolicy(MemoryPolicy.NO_CACHE).into((Target) activity.user_image.getTag());

                Utility.printLog("Amazon upload success ");
                new BackgroundForUpdateProfile().execute();
            } else {
                dialogL.dismiss();
                Utility.showToast(getActivity(), getResources().getString(R.string.network_connection_fail));
            }
        }

        @Override
        public void error(String errormsg) {
            dialogL.dismiss();
            Utility.showToast(getActivity(), getResources().getString(R.string.network_connection_fail));
        }
    });
}
0
surya Mouly