【发布时间】:2015-03-23 15:07:36
【问题描述】:
我从 2 天开始就试图在 google 上找到解决方案,但没有任何解决方案。
DefaultAWSCredentialsProviderChain credentialProviderChain = new DefaultAWSCredentialsProviderChain();
TransferManager tx = new TransferManager(credentialProviderChain.getCredentials());
Upload myUpload = tx.upload(existingBucketName, keyName, new File("C:/Users/Desktop/Management_System.jpg"));
// While the transfer is processing, you can work with the transfer object
while (myUpload.isDone() == false) {
System.out.println(myUpload.getProgress().getPercentTransferred() + "%");
}
myUpload.waitForCompletion();
tx.shutdownNow();
此代码工作正常并上传图像Management_System.jpg,该图像已成功放入我的桌面到aws s3存储桶。我有一个带有文件字段的 html 表单。我想浏览我电脑中的任何图像并将其上传到我的 s3 存储桶中。我也在下面的代码中尝试了这个,当我在亚马逊 ec2 上测试它时它在我的本地主机上运行良好,然后它抛出类似“ImageIO write Invalid native argument”的错误。我已将文件字段放入我的表单名称 [照片]。所以我的代码如下:
BufferedImage src = ImageIO.read(photo.getInputStream());
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(src, "JPG", os);
byte[] buffer = os.toByteArray();
InputStream is = new ByteArrayInputStream(buffer);
AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());
if(isValidFile(s3client, existingBucketName, info.getPhoto())){
s3client.deleteObject(new DeleteObjectRequest(existingBucketName, info.getPhoto()));
}
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(buffer.length);
meta.setContentType(photo.getContentType());
s3client.putObject(new PutObjectRequest(existingBucketName, keyName, is, meta));
s3client.setObjectAcl(existingBucketName, keyName, CannedAccessControlList.PublicRead);
请指导我哪里做错了?我在 ec2 实例上使用 tomcat 7,我的本地主机版本也是 tomcat 7。我不明白这是版本兼容性问题还是其他什么...
更新答案:
最后我让它工作。这是我通过 html 表单字段上传的完整文件代码。我在这里发布它是为了帮助其他人,如果你觉得它有帮助,请给我投票。谢谢
AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(DashboardController.class.getResourceAsStream("/AWSCredentials.properties")));
TransferManager tx = new TransferManager(new PropertiesCredentials(DashboardController.class.getResourceAsStream("/AWSCredentials.properties")));
//AmazonS3 s3 = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
if(isValidFile(s3, BucketName, info.getPhoto())){
s3.deleteObject(new DeleteObjectRequest(BucketName, info.getPhoto()));
}
S3Object s3Object = new S3Object();
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType(photo.getContentType());
meta.setContentLength(photo.getSize());
meta.setHeader("filename", NewkeyName);
ByteArrayInputStream bis = new ByteArrayInputStream(photo.getBytes());
s3Object.setObjectContent(bis);
//s3.putObject(new PutObjectRequest(BucketName, NewkeyName, bis, omd));
Upload myUpload = tx.upload(BucketName, NewkeyName, bis, meta);
while (myUpload.isDone() == false) {
System.out.println(myUpload.getProgress().getPercentTransferred() + "%");
}
if(myUpload.isDone() == true){
System.out.println("100%");
}
s3.setObjectAcl(BucketName, NewkeyName, CannedAccessControlList.PublicRead);
myUpload.waitForCompletion();
tx.shutdownNow();
s3Object.close();
【问题讨论】:
-
你有一些代码。什么不起作用?
-
您好 tedder42,感谢您的回复。请再看看我的问题。我上传了我的代码。
-
嗨伙计,我已经花了一个多星期的时间试图找出完全相同的问题。非常感谢代码帮助。我仍然收到很多错误。我可以知道我需要在我的代码中导入哪些包吗?
-
收到此错误:com.amazonaws.services.s3.model.AmazonS3Exception:AWS 身份验证需要有效的 Date 或 x-amz-date 标头(服务:Amazon S3;状态代码:403;错误代码:访问被拒绝;请求 ID:D27A13B41C01AF88),S3 扩展请求 ID:SnDRF7tppd0ADkOfi/npzgsk37eX7S2wrRAB4WWFM+i5n03dt2juimTyhBTw0B+mvmsX0tdAZR8= 请协助
-
如果日期无效,请检查您的服务器时间戳。
标签: java html amazon-web-services amazon-s3