【问题标题】:Image upload amazon s3 android SDK 2.0图片上传amazon s3 android SDK 2.0
【发布时间】:2014-11-24 01:44:39
【问题描述】:

我想将图像上传到 android 中的 amazon s3 存储桶。 我没有收到任何错误,但它只是不工作有人可以帮助我吗? 我找不到任何关于这方面的好例子或问题。

我将图像分配给“文件图像3”

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

    }

我在我设置的每个人都可以读写的权限中创建了我的存储桶。

在 amazon cognito 中,我只是将所有内容保留为默认设置。

有人知道我怎样才能让它工作吗?

【问题讨论】:

标签: java android amazon-web-services amazon-s3 amazon


【解决方案1】:

试试这个。因为我遇到了和你一样的问题。

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

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

【讨论】:

  • 如何从您选择的图像中获取真实的文件路径?
【解决方案2】:

在 s3 amazon 中下载图像和上传图像的非常简单的方法。你做一个简单的类使用这个 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;
}

【讨论】:

  • 这对于带有循环的多个文件是否可行?我要上传多张图片
  • 我有 2 个只放 PutObjectRequest 请求 =... 在循环中吗?
【解决方案3】:

你应该做两步;

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

s3Client.putObject(por);
  1. 通过更改存储桶(文件夹)公共来更改 Amazon s3 服务器控制台的策略。

我已经这样做了,它正在工作。

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 2012-07-31
    • 2015-08-24
    • 2019-05-15
    • 2015-06-20
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多