2017-10-05 138 views
2

我在尝试这里之前确实尝试了所有链接。 我不知道该怎么做,我搜索了一切,尝试了许多不同的方法,没有任何工作。从图库上传图片到S3 AWS android123

我认为问题出在文件字符串路径中。这是我的主代码:

package com.android.dji.eaglei; 

import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Build; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.amazonaws.auth.CognitoCachingCredentialsProvider; 
import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener; 
import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver; 
import com.amazonaws.mobileconnectors.s3.transferutility.TransferState; 
import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility; 
import com.amazonaws.regions.Region; 
import com.amazonaws.regions.Regions; 
import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3Client; 
import com.amazonaws.services.s3.model.Tag; 

import java.io.File; 

public class MainActivity extends AppCompatActivity { 

    //for image upload 
    private ImageView imageView; 
    private Button button; 
    private static final int PICK_IMAGE = 1; 
    private Uri imageUri; 
    String imageName = "newTest.jpg"; 
    private Button upload; 
    // 

    // for aws 
    String bucket = "eagleibucket"; 
    File fileToUpload ; 
    AmazonS3 s3; 
    TransferUtility transferUtility; 
    // 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // callback method to call credentialsProvider method. 
     credentialsProvider(); 
     // callback method to call the setTransferUtility method 
     setTransferUtility(); 

     //uploading image 
     imageView = (ImageView) findViewById(R.id.imageView); 
     button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       openGallery(); 
      } 
     }); 
     upload = (Button) findViewById(R.id.upload); 
     upload.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       setTransferUtility(); 
       setFileToUpload(v); 
      } 
     }); 
    } 
    protected void openGallery(){ 
     Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(gallery,PICK_IMAGE); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     try { 
      if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) { 
       imageUri = data.getData(); 
       imageView.setImageURI(imageUri); 
       // aws uri img to upload 
       imageName = (String) imageView.getTag(); 
       imageUri = data.getData(); 
       imageView.setImageURI(imageUri); 




      } else { 
       Toast.makeText(this, "You haven't picked an image", Toast.LENGTH_LONG).show(); 
      } 
     } catch (Exception e) { 
      Toast.makeText(this, "Something went wrong!", Toast.LENGTH_LONG).show(); 
     } 
    } 
    public void credentialsProvider(){ 

     // Initialize the Amazon Cognito credentials provider 
     CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
       getApplicationContext(), 
       "us-west-2:edb44a70-b31e-44b0-b8c7-2d38a9c7c98f", // Identity pool ID 
       Regions.US_WEST_2 // Region 
     ); 
     setAmazonS3Client(credentialsProvider); 
    } 
    /** 
    * Create a AmazonS3Client constructor and pass the credentialsProvider. 
    * @param credentialsProvider 
    */ 
    public void setAmazonS3Client(CognitoCachingCredentialsProvider credentialsProvider){ 
     // Create an S3 client 
     s3 = new AmazonS3Client(credentialsProvider); 
     // Set the region of your S3 bucket 
     s3.setRegion(Region.getRegion(Regions.US_WEST_2)); 
    } 
    public void setTransferUtility(){ 
     transferUtility = new TransferUtility(s3, getApplicationContext()); 
    } 
    /** 
    * This method is used to upload the file to S3 by using TransferUtility class 
    * @param view 
    */ 
    public void setFileToUpload(View view){ 
     fileToUpload = new File(getRealPathFromURI(imageUri)); 
     if (fileToUpload == null) { 
      Toast.makeText(this, "Could not find the filepath of the selected file", Toast.LENGTH_LONG).show(); 
        // to make sure that file is not emapty or null 
      return; 
     } 
     TransferObserver transferObserver = transferUtility.upload(
       bucket, 
       imageName, 
       fileToUpload 
     ); 
     transferObserverListener(transferObserver); 
    } 
    /** 
    * This is listener method of the TransferObserver 
    * Within this listener method, we get status of uploading and downloading file, 
    * to display percentage of the part of file to be uploaded or downloaded to S3 
    * It displays an error, when there is a problem in uploading or downloading file to or from S3. 
    * @param transferObserver 
    */ 
    public void transferObserverListener(TransferObserver transferObserver){ 
     transferObserver.setTransferListener(new TransferListener(){ 
      @Override 
      public void onStateChanged(int id, TransferState state) { 
       Toast.makeText(getApplicationContext(), "State Change" + state, 
         Toast.LENGTH_SHORT).show(); 
      } 
      @Override 
      public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { 
       int percentage = (int) (bytesCurrent/bytesTotal * 100); 
       Toast.makeText(getApplicationContext(), "Progress in %" + percentage, 
         Toast.LENGTH_SHORT).show(); 
      } 
      @Override 
      public void onError(int id, Exception ex) { 
       Log.e("error","error"); 
      } 
     }); 
    } 
    private String getRealPathFromURI(Uri contentURI) { 
     String thePath = "no-path-found"; 
     String[] filePathColumn = {MediaStore.Images.Media.DISPLAY_NAME}; 
     Cursor cursor = getContentResolver().query(contentURI, filePathColumn, null, null, null); 
     if(cursor.moveToFirst()){ 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      thePath = cursor.getString(columnIndex); 
     } 
     cursor.close(); 
     return thePath; 
    } 
} 

清单:我添加了权限以及服务。我还添加了所需的库。

这是错误:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.android.dji.eaglei, PID: 
     java.lang.IllegalArgumentException: Invalid file: 
      at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:478) 
      at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:443) 
      at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:412) 
      at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:353) 
      at com.android.dji.eaglei.MainActivity.setFileToUpload(MainActivity.java:134) 
      at com.android.dji.eaglei.MainActivity$2.onClick(MainActivity.java:70) 
      at android.view.View.performClick(View.java:5716) 
      at android.widget.TextView.performClick(TextView.java:10926) 
      at android.view.View$PerformClick.run(View.java:22596) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:7331) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

感谢您的帮助!

+0

您可以打印getRealPathFromURI的返回值并检查该文件是否存在于该路径中?你使用的是什么版本的AWS Android SDK? – Karthikeyan

回答

0

我认为你试图上传的文件路径是空的(因为没有写在错误附近)。 尝试将fileToUpload与该文件的路径,甚至另一个文件的路径进行交换,仅用于检查。 当你成功时,你可以尝试你的文件,并尝试在应用程序运行过程中查看“transferUtility.upload”中fileToUpload的值。