【问题标题】:java - upload image file into my aws s3 bucket through html file fieldjava - 通过html文件字段将图像文件上传到我的aws s3存储桶中
【发布时间】: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


【解决方案1】:

问题似乎出在 S3 代码之前。

错误信息与 ImageIO.write 有关。

小搜索显示OpenJDK doesn't include JPEG support

您可以在不使用 S3 的情况下本地测试这部分代码(确保使用相同的 JRE)。

您为什么要使用 ImageIO?在放入 S3 之前是否进行转码

【讨论】:

  • 您好 Kazaag,感谢您的回复。我是来自 php 背景的 java 编程新手。所以我正在寻找将文件从表单文件字段上传到 s3 的最简单方法。你能在示例代码的帮助下帮助我解决这个问题吗?
  • 如果你只是使用 ImageIO 来获取字节数组,stackoverflow.com/questions/1264709/… 会帮你找到另一种方式。要获取 Oracle/Sun JDK,您可以访问此处:oracle.com/technetwork/java/javase/downloads/index.html。开放式 JDK 是 JDK 的开源版本,其中删除了任何可能的外部专利的元素。
  • 您好 Kazaag,感谢您的回复。我已经查看了您提供的示例。提供的解决方案有很多混乱。请您协助我处理我的代码。如果您帮助我编写代码以便我可以轻松实现它,我将不胜感激。谢谢
猜你喜欢
  • 2018-04-25
  • 2021-07-22
  • 2021-02-07
  • 2016-12-05
  • 2020-03-17
  • 1970-01-01
  • 2018-09-29
  • 2017-10-17
  • 2017-09-24
相关资源
最近更新 更多