2014-11-24 60 views
5

我想上传一个图像到android的亚马逊s3桶。 我没有得到任何错误,但它只是不工作,任何人都可以帮助我吗? 我找不到任何关于此的好例子或问题。图片上传亚马逊s3 android SDK 2.0

我分配到“文件images3”

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(); 

    } 

我创建了一个水桶形象,在我的权限设置,每个人都可以写和读。

在亚马逊认知我刚刚离开一切为默认。

任何人都知道我如何才能使这个工作?

+0

您拍照时看看TransferManager样? https://github.com/awslabs/aws-sdk-android-samples/tree/master/S3_TransferManager – 2014-11-25 18:58:36

回答

3

试试这个。因为我遇到了同样的问题。

我已经通过使用下面的代码修复。

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

如何从您选择的图像中获取真正的文件路径? – Laurenswuyts 2014-12-02 17:30:34

0

你应该做两个步骤;

  1. 像这样创建PutObjectRequestObject:
PutObjectRequest por = new PutObjectRequest(
           BUCKET_NAME, Key, 
           stored); 
         por.setCannedAcl(CannedAccessControlList.PublicReadWrite); 

s3Client.putObject(por); 
  • 更改策略亚马逊S3服务器控制台通过改变桶(文件夹)公共。
  • 我已经做到了,它的工作。

    1

    非常简单的方法来下载图像和上传图像在S3亚马逊。你做一个简单的类使用该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); 
    } 
    
    } 
    

    调用此WebService在任何项目中,

    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

    这是可能的多个文件循环?我有多个图像上传 – 2018-02-28 18:26:32

    +0

    是的,你可以通过使用循环 – 2018-03-01 03:50:40

    +0

    我有2只把PutObjectRequest请求= ...在循环的权利? – 2018-03-01 12:11:06