如何在android中将文件上传到amazon s3时设置权限

时间:2016-10-27 06:18:37

标签: android amazon-web-services file-upload amazon-s3

在android中我将文件上传到aws s3。它已成功上传。但上传的文件没有公开权限。它无法公开访问。

TransferObserver transferObserver = transferUtility.upload(" appname"," filename",file);

但是当我将代码重写为

TransferObserver transferObserver = transferUtility.upload(" acs-android"," filename",file,CannedAccessControlList.PublicRead);

用于访问公共权限,它显示错误。

错误:无法执行HTTP请求:写入错误:ssl = 0xb8f43420:系统调用期间的I / O错误,由对等方重置连接。

完整的代码是

import android.os.Environment;
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.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.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.GroupGrantee;
import com.amazonaws.services.s3.model.Permission;
import com.amazonaws.services.s3.model.Region;

import java.io.File;

public class MainActivity extends AppCompatActivity {

Button button;

File sdcard = Environment.getExternalStorageDirectory();
File file = new File(sdcard,"filename");

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = (Button) findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            fileUpload();
        }
    });
}

private void fileUpload() {

// Initialize the Amazon Cognito credentials provider
    CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
            getApplicationContext(),
            "xxx:7e4xxx-xxxxxxxxx-xx-48cfc8f79f6", // Identity Pool ID
            Regions.REGION // Region
    );

    AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
    s3.setRegion(com.amazonaws.regions.Region.getRegion(Regions.REGION));

    TransferUtility transferUtility = new TransferUtility(s3, this);



    TransferObserver transferObserver = transferUtility.upload("appname","filename",file,CannedAccessControlList.PublicRead);


    transferObserver.setTransferListener(new TransferListener() {
        @Override
        public void onStateChanged(int id, TransferState state) {
            if(state == TransferState.COMPLETED) {
                Toast.makeText(MainActivity.this,"Error",Toast.LENGTH_SHORT).show();
            }

        }

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

        }

        @Override
        public void onError(int id, Exception ex) {

            Log.e("LOGTAG", "Error : " + ex.getMessage());

        }
    });

}
}

2 个答案:

答案 0 :(得分:0)

您需要在PutObjectRequest

中使用upload()
getTransferManager().upload(
    new PutObjectRequest(String bucketName, String key, File file)
   .withCannedAcl(CannedAccessControlList.PublicRead)
); 

答案 1 :(得分:0)

我只是用这个

TransferObserver transferObserver = transferUtility.upload("acs-android","filename",file,CannedAccessControlList.PublicRead) 

它工作正常。 确保您没有在亚马逊s3桶上设置任何存储桶策略。