无法计算MD5: AWS S3存储桶

5
我将我的应用程序托管在AWS Elastic Beanstalk - Tomcat 6上。我的数据文件存储在S3存储桶中。当我在本地服务器上托管我的应用程序时,我可以读取和写入我的S3存储桶中的数据(使用SDK),但是从Elastic Beanstalk托管的应用程序中,写操作显示错误,即在Elastic Beanstalk Tomcat上。我收到以下错误:
com.amazonaws.AmazonClientException: Unable to calculate MD5 hash: visitorsinfo.json(没有这样的文件或目录)
我确实在我的S3存储桶中有visitorsinfo.json文件,该文件可以成功从我的本地服务器访问,但无法从Elastic Beanstalk访问。

EBS = 弹性块存储。您是指弹性 Beanstalk 吗? - Mark B
2
另外,那个错误信息的关键部分是 No such file or directory 而不是你似乎专注于的 Unable to calculate MD5 hash。文件实际上并不存在。 - Mark B
嗨,这是Elastic Beanstalk。当我将我的本地机器指向相同的存储桶时,文件存在并且已被修改。这是非常奇怪的行为,有什么猜测吗? - user3112954
添加一些代码以打印S3对象的完整bucket和key,也许服务器上使用了不正确的key前缀? - Mark B
嗨,我通过创建一个新的应用程序来解决这个问题,使用64位Amazon Linux 2014.03 v1.1.0运行Tomcat 7 Java 6。 - user3112954
3个回答

7

不要传递文件对象,而是将输入流作为put对象的参数传递,如下所示

InputStream is=file.getInputStream();                                                                           
s3client.putObject(new PutObjectRequest(bucketName, keyName,is,new ObjectMetadata())); 

@SkyWalker,你能解释一下如何使用InputStream而不是文件来解决问题吗? - KidWithAComputer
@PrakharVerma 请查看 https://dev59.com/9l4b5IYBdhLWcg3w5VI9#28569038 - SkyWalker
@SkyWalker 我仍然对此持怀疑态度..我已经检查了将File传递给函数的内部实现。File被转换为FileInputStream。下面分享AWS SDK的代码。 - Aditya Rewari
public PutObjectResult putObject(PutObjectRequest putObjectRequest) throws SdkClientException, AmazonServiceException { putObjectRequest = (PutObjectRequest)this.beforeClientExecution(putObjectRequest); this.rejectNull(putObjectRequest, "上传对象时必须指定PutObjectRequest参数"); File file = putObjectRequest.getFile(); InputStream isOrig = putObjectRequest.getInputStream(); String bucketName = putObjectRequest.getBucketName(); - Aditya Rewari

-1

通过创建一个新的应用程序,采用配置为64位Amazon Linux 2014.03 v1.1.0、运行Tomcat 7和Java 6的方案,解决了此问题。


-1

兄弟,我也有同样的问题。但对我来说,我忘了在发送文件之前设置读取文件的权限。就是这样。

ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE), 300)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接