Upload to s3 with curl using pre-signed URL (getting 403)

后端 未结 4 1796
南旧
南旧 2021-02-12 11:59

I\'m using curl to call into a Java ReST API to retrieve a URL. Java then generates a pre-signed URL for S3 upload using my S3 credentials, and returns that in the ReST reply. C

4条回答
  •  广开言路
    2021-02-12 12:35

    The way to generate the URL:

    private static URL generateRUL(String objectKey, String ACCESS_KEY, String SECRET_KEY, String BUCKET_NAME) {
        AmazonS3 s3Client = new AmazonS3Client(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY));
        URL url = null;
    
        try {
            GeneratePresignedUrlRequest request  = new GeneratePresignedUrlRequest(BUCKET_NAME, objectKey);
            request.setMethod(com.amazonaws.HttpMethod.PUT);
            request.setExpiration(new Date( System.currentTimeMillis() + (60 * 60 * 1000)));
    
            // Very important ! It won't work without adding this! 
            // And request.addRequestParameter("Content-Type", "application/octet-stream") won't work neither
            request.setContentType("application/octet-stream");
    
            url = s3Client.generatePresignedUrl(request ); 
        } catch (AmazonServiceException exception) { 
        } catch (AmazonClientException ace) { }
    
        return url;
    }
    

    The way to upload the file:

    public int upload(byte[] fileBytes, URL url) {
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("PUT");
        connection.setRequestProperty("Content-Type", "application/octet-stream"); // Very important ! It won't work without adding this!
        OutputStream output = connection.getOutputStream();
    
        InputStream input = new ByteArrayInputStream(fileBytes);
        byte[] buffer = new byte[4096];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
        output.flush();
    
        return connection.getResponseCode();
    }
    

提交回复
热议问题