2014-11-24 19 views
5

Ich möchte ein Bild in einen Amazon S3-Eimer in Android hochladen. Ich bekomme keine Fehler, aber es funktioniert einfach nicht Kann mir jemand helfen? Ich kann keine guten Beispiele oder Fragen dazu finden.Bild hochladen amazon s3 android SDK 2.0

ich ein Bild zu ‚Datei images3‘ zuweisen

images3 = new File(uri.getPath()); 

public void addEventToDB(){ 

     Thread thread = new Thread() 
     { 
      @Override 
      public void run() { 
       try { 
        CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
          getActivity().getApplicationContext(), // get the context for the current activity 
          "...", 
          "us-east-1:...", 
          "arn:aws:iam::...:role/Cognito_WitpaAuth_DefaultRole", 
          "arn:aws:iam::...:role/Cognito_WitpaAuth_DefaultRole", 
          Regions.US_EAST_1 
        ); 

        String bucket_name = "witpa"; 
        String key = "images.jpeg"; 

        TransferManager transferManager = new TransferManager(credentialsProvider); 
        transferManager.upload(bucket_name, key, images3); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

     thread.start(); 

    } 

ich meinen Eimer erstellt, in den Berechtigungen ich, dass jeder schreiben und lesen.

In Amazon Cognito habe ich alles als Standard verlassen.

Weiß jemand, wie ich das zur Arbeit bringen kann?

+0

Sie einen Blick auf die Transfermanager Probe genommen haben? https://github.com/awslabs/aws-sdk-android-samples/tree/master/S3_TransferManager –

Antwort

3

Versuchen Sie diese. Da ich das gleiche Problem hatte, mit dem du konfrontiert warst.

Ich habe mit dem folgenden Code behoben.

ObjectMetadata metadata = new ObjectMetadata(); 
metadata.setContentEncoding("UTF-8"); 
size = inputStream.available(); 
metadata.setContentLength(size); 
TransferManager transferManager = new TransferManager(credentialsProvider); 
Upload upload = transferManager.upload(bucket_name, key, images3, metadata); 
upload.waitForCompletion(); 
+0

Wie erhalten Sie den echten Dateipfad von dem ausgewählten Bild? – Laurenswuyts

0

Sie sollten zwei Schritte tun müssen;

  1. Erstellen Sie die PutObjectRequestObject So:
PutObjectRequest por = new PutObjectRequest(
           BUCKET_NAME, Key, 
           stored); 
         por.setCannedAcl(CannedAccessControlList.PublicReadWrite); 

s3Client.putObject(por); 
  1. Veränderung der Politik der Amazon S3 Server-Konsole durch Ändern der Eimer (Ordner) Öffentliche .

Ich war schon fertig und es funktioniert.

1

Sehr einfache Möglichkeit, Bild herunterzuladen und Bild in s3 Amazon hochladen. machen Sie eine einfache Klasse verwenden diese 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); 
} 

} 

Anruf von diesem WebService, wo jeder in Projekt

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

Ist dies für mehrere Dateien mit Schleifen möglich? Ich habe mehrere Bilder zum Hochladen –

+0

ja, Sie können es tun, indem Sie Schleife –

+0

Ich habe 2 PutObjectRequest Anfrage = ... in Schleifen richtig? –