我已经尝试了很长时间来解决这个问题,但是没有成功。我正在使用AWS Android SDK将文件上传到AWS S3,有时我的文件上传到了服务器,其他的则没有。 putObject指令已执行,但它只是“挂断”并在该行锁定代码执行。
通过尝试注释代码片段以查找问题的根源,我得出了这种情况的结论,因为我在上传任何文件之前先调用listObjects。
我无法删除此listObjects,因为我需要在应用启动时获取文件名,并且只有在用户选择了要上传的内容之后,才会进行任何上传。
我通常从自己的单元上传大约1到1.3 MB的照片,并且上传结果不到30秒。如果我调用listObjects,它将“挂断”。为什么会这样呢?有人知道发生了什么吗?这是我的代码的几行:
在android onCreate期间:
weather_data = new ArrayList<Weather>();
ObjectListing objectListing = s3Client.listObjects(new ListObjectsRequest().withBucketName(lista_de_baldes.get(0).getName()).withPrefix("Thumbs"));
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries())
weather_data.add(new Weather(R.drawable.jogo, objectSummary.getKey().replace("Thumbs/", "")));
用户选择要上传的照片后(在doInBackground期间从扩展AsyncTask以防止主线程冻结的类中执行):
File arquivo = new java.io.File(filePath);
PutObjectRequest por = new PutObjectRequest(
lista_de_baldes.get(0).getName(),
filePath.substring(filePath.lastIndexOf('/') + 1),
arquivo
);
s3Client.putObject(por);
他们也是使用相同的存储桶,相同的区域和相同的区域。 objectListing也可以正常运行。
编辑:我通过在上传代码中再次设置AmazonS3Client变量来“解决”该问题。像这样:
s3Client = new AmazonS3Client(
new BasicAWSCredentials(Constants.ACCESS_KEY_ID, Constants.SECRET_KEY)
);
s3Client.setRegion(Region.getRegion(Regions.SA_EAST_1));
但这对我来说没有意义,因为它是一个全局变量。下载对象列表后,看起来简单了“锁定”。有人知道发生了什么吗?
编辑:根据要求,这里有更多的代码。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
s3Client = new AmazonS3Client(
new BasicAWSCredentials(Constants.ACCESS_KEY_ID, Constants.SECRET_KEY)
);
//mudei de US_WEST_2 para SA_EAST_1 (south america) para acessar um bucket criado em SP/Brazil
s3Client.setRegion(Region.getRegion(Regions.SA_EAST_1));
lista_de_baldes = s3Client.listBuckets();
setContentView(R.layout.main);
weather_data = new ArrayList<Weather>();
ObjectListing objectListing = s3Client.listObjects(new ListObjectsRequest().withBucketName(lista_de_baldes.get(0).getName()).withPrefix("Thumbs"));
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
File arquivo_thumb = new File(getCacheDir() + File.separator + objectSummary.getKey().replace("Thumbs/", ""));
weather_data.add(new Weather(R.drawable.jogo, arquivo_thumb.getName().replace(".png", ".jpg")));
if(arquivo_thumb.exists())
continue;
InputStream input = null;
try {
ResponseHeaderOverrides override = new ResponseHeaderOverrides();
override.setContentType("image/jpeg");
GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(
lista_de_baldes.get(0).getName(),
"Thumbs/" + arquivo_thumb.getName()
);
urlRequest.setResponseHeaders(override);
URL url = s3Client.generatePresignedUrl(urlRequest);
...
}
上传部分:
protected S3TaskResult doInBackground(Uri... uris) {
if (uris == null || uris.length != 1) {
return null;
}
// The file location of the image selected.
Uri selectedImage = uris[0];
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
filePath = cursor.getString(columnIndex);
cursor.close();
S3TaskResult result = new S3TaskResult();
// Put the image data into S3.
try {
// Content type is determined by file extension.
File arquivo = new java.io.File(filePath);
PutObjectRequest por = new PutObjectRequest(
lista_de_baldes.get(0).getName(),
filePath.substring(filePath.lastIndexOf('/') + 1),
arquivo
);
por.setCannedAcl(CannedAccessControlList.PublicRead);
s3Client.putObject(por);
最佳答案
listObject是否包装在AsyncTask中?您是否等到listObjects完成?仅供参考,从Honeycomb级别11开始,默认情况下顺序执行多个AsyncTask实例。