java - 使用java将Base64编码的图像上传到Amazon s3

标签 java amazon-web-services amazon-s3

我正在尝试使用 Amazon 的 Java API 将文件上传到 Amazon S3 存储。代码是

Byte[] b = data.getBytes();
InputStream stream  = new ByteArrayInputStream(b);
//InputStream stream = new FileInputStream(new File("D:/samples/test.txt"));
AWSCredentials credentials = new BasicAWSCredentials("<key>", "<key1>");
AmazonS3 s3client = new AmazonS3Client(credentials);
s3client.putObject(new PutObjectRequest("myBucket",name,stream, new ObjectMetadata()));

当我在注释前两行并取消注释第三行后运行代码时,即 stream 是一个 FileoutputStream,文件被正确上传。但是当data是一个base64编码的字符串,也就是图片数据时,文件上传了但是图片损坏了。 亚马逊文档说我需要创建并附加一个 POST 策略和签名才能工作。我如何在 Java 中做到这一点?我没有使用 html 表单进行上传。

最佳答案

首先你应该从字符串的开头删除 data:image/png;base64:

示例代码块:

byte[] bI = org.apache.commons.codec.binary.Base64.decodeBase64((base64Data.substring(base64Data.indexOf(",")+1)).getBytes());

InputStream fis = new ByteArrayInputStream(bI);

AmazonS3 s3 = new AmazonS3Client();
Region usWest02 = Region.getRegion(Regions.US_WEST_2);
s3.setRegion(usWest02);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(bI.length);
metadata.setContentType("image/png");
metadata.setCacheControl("public, max-age=31536000");
s3.putObject(BUCKET_NAME, filename, fis, metadata);
s3.setObjectAcl(BUCKET_NAME, filename, CannedAccessControlList.PublicRead);

关于java - 使用java将Base64编码的图像上传到Amazon s3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30939904/

相关文章:

java - wait 和 notifyall 等待其他线程

java - 由 : org. springframework.beans.factory.NoSuchBeanDefinitionException 引起:运行测试时

laravel - 指定的键不存在 - Laravel

node.js - Amazon SES 电子邮件不再发送

amazon-web-services - 如何在 Amazon Linux AMI 版本 2012.03 上安装 pdftk

amazon-web-services - 使用 AWS S3 静态网络托管将文件上传到 S3

python - 上市后 S3 key 不立即出现

java - 如何在 java 中漂亮地打印格式正确的无效 XML 片段?

java - Linux 版本检查 Linux 命令或 Java 代码

amazon-s3 - 文件夹不会在 Amazon S3 上删除