Amazon S3 - 不允许的方法

Posted

技术标签:

【中文标题】Amazon S3 - 不允许的方法【英文标题】:Amazon S3 - Method Not Allowed 【发布时间】:2016-01-25 22:46:19 【问题描述】:

我正在尝试第一次配置来自 Amazon 的 S3 服务,但我无法上传文件,因为我得到了以下异常(我已经授予用户对 S3 的完全访问权限,但我一直得到这个):

方法不允许(服务:Amazon S3;状态代码:405;错误代码:405 方法不允许;...)

下面的类是我的配置类(为了安全起见,key改成了“xxx”):

public class AmazonConfiguration 

    private final String ACCESS_KEY = "xxxxxxxxx";
    private final String SECRET_KEY = "xxxxxxxxx";
    
    @Bean
    private AmazonS3 amazonS3client() 
    
        //Credenciais de acesso
        AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
        
        AmazonS3 s3Client = new AmazonS3Client(credentials, new ClientConfiguration());
        s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
        s3Client.setEndpoint("http://springmvccasadocodigo.s3-website-us-west-2.amazonaws.com/"); //springmvccasadocodigo.s3-website-sa-east-1.amazonaws.com

        return s3Client;
    


下一节课是我尝试上传文件的地方:

@Component
public class FileServer 

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private AmazonS3 s3;

    

    public String writeAmazonS3(String baseFolder, MultipartFile multpartFile) 

        try 

            s3.putObject("springmvccasadocodigo",
                    multpartFile.getOriginalFilename(),
                    multpartFile.getInputStream(), new ObjectMetadata());
            
            return "http://springmvccasadocodigo.s3-website-us-west-2.amazonaws.com/"
                    + multpartFile.getOriginalFilename() + "?noAuth=true";
            
         catch (AmazonClientException | IOException e) 
            e.printStackTrace();
            throw new RuntimeException();
        
    

【问题讨论】:

【参考方案1】:
s3Client.setEndpoint("http://springmvccasadocodigo.s3-website-us-west-2.amazonaws.com/"); //springmvccasadocodigo.s3-website-sa-east-1.amazonaws.com

这不是一个合适的端点。并且将它与“路径样式访问”结合起来使得调试变得更加困难。 (“路径样式语法...要求您在尝试访问存储桶时使用特定于区域的端点。”)

Here's the list of endpoints;如果您的存储桶位于 us-west-2 中,则正确的端点是 s3-us-west-2.amazonaws.com。但是,这对于 API 的“标签外”使用最有用,例如连接到 OpenStack 资源。

我相信您可以简单地删除这两行(“setEndpoint”和“setS3ClientOptions”)。

【讨论】:

以上是关于Amazon S3 - 不允许的方法的主要内容,如果未能解决你的问题,请参考以下文章

正确上传到 Amazon S3 的权限

Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket

允许来自 Amazon S3 的 AJAX GET? (访问控制允许来源)

使用 Amazon S3 阻止公有访问

json 列出所有Amazon S3存储桶并允许管理单个存储桶。

Amazon S3 策略只允许上传而不是覆盖 [重复]