AWS S3 पोस्ट ऑब्जेक्ट अतिरिक्त फॉर्म फ़ील्ड को अस्वीकार करता है

Nov 24 2020

मैं एक अपलोड छवि के भंडारण वर्ग को AWS S3 बाल्टी में सेट करने का प्रयास कर रहा हूं। मेरे पास अनुरोध करने के लिए भंडारण वर्ग को जोड़ने के अलावा यह काम कर रहा है। S3 पोस्ट वस्तु प्रलेखन राज्यों वहाँ एक फार्म इनपुट "एक्स-AMZ भंडारण श्रेणी" लेकिन यह जोड़ने नामित क्षेत्र, या किसी अन्य क्षेत्र हो सकता है, यह दर्शाता है पद के लिए भी कई इनपुट फ़ील्ड देखते हैं कि एक एडब्ल्यूएस त्रुटि फेंकता है। मैंने इसे ऑब्जेक्ट नीति में जोड़ने का प्रयास किया, लेकिन इससे नीति में त्रुटि होती है: "नीति की स्थिति विफल: [" eq "," $ x-amz-storage-class "," ONEZONE_IA "]"। मैं JSP का उपयोग कर रहा हूं और प्रपत्र के इनपुट फ़ील्ड नीचे दिखाए गए हैं। किसी भी सहायता की सराहना की जाएगी।

<input type="hidden" name="key" value="<%= imageFileName %>">
<input type="hidden" name="AWSAccessKeyId" value="<%= S3AccessKeyId %>"> 
<input type="hidden" name="acl" value="private"> 
<input type="hidden" name="success_action_redirect" value="<%= s3SuccessAction %>">
<input type="hidden" name="policy" value="<%= encPolicy %>" >
<input type="hidden" name="signature" value="<%= signature %>" >
<input type="hidden" name="Content-Type" value="image/jpeg">
<input type="hidden" name="x-amz-storage-class" value="ONEZONE_IA">   ***** CAUSES ERROR ****

त्रुटियाँ:

Invalid according to Policy: Policy Condition failed: [“eq”, “$x-amz-storage-class”, “STANDARD_IA”]

<Error>
<Code>AccessDenied</Code>
<Message>
Invalid according to Policy: Extra input fields: x-amz-storage-class
</Message>
<RequestId>1104FC046523752C</RequestId>
<HostId>
m0xPpMKJqBG6kZsdQfl/RY92dHprnvtGtrijHLqVtieM51ew+Mkp0mXGbTwKM7OsoUq6ZZUVIc0=
</HostId>
</Error>

जवाब

glez Nov 24 2020 at 05:56

मेरे पास अभी यह काम है। नीति में वे फ़ील्ड हैं जो फ़ॉर्म पर फ़ील्ड से मेल खाना चाहिए। "x-amz-storage-class" को फॉर्म फील्ड और पॉलिसी दोनों में जोड़ा जाना चाहिए। मेरा अनुमान है कि एन्कोडेड पॉलिसी को सुरक्षा कारणों से हस्ताक्षरित किया गया है जो इसे सुरक्षित बनाता है और यह सुनिश्चित करने के लिए कि उन्हें परिवर्तित नहीं किया गया है, फॉर्म फ़ील्ड को पॉलिसी फ़ील्ड से मेल खाना चाहिए। दोनों की आवश्यकता क्यों है यह मुझसे परे है। सही कोड नीचे है:

<fieldset>

    <input type="hidden" name="key" value="<%= imageFileName %>">
    <input type="hidden" name="AWSAccessKeyId" value="<%= S3AccessKeyId %>"> 
    <input type="hidden" name="acl" value="private"> 
    <input type="hidden" name="success_action_redirect" value="<%= s3SuccessAction %>">
    <input type="hidden" name="policy" value="<%= encPolicy %>" >
    <input type="hidden" name="signature" value="<%= signature %>" >
    <input type="hidden" name="Content-Type" value="image/jpeg">
    <input type="hidden" name="x-amz-storage-class" value="ONEZONE_IA">
    

public static String encodeS3Policy(String s3SuccessAction, String bucket) throws Exception
{
    String policy =
        "{\"expiration\": \"2040-01-01T00:00:00Z\"," +
          "\"conditions\": [" +
            "{\"bucket\": \"" + bucket + "\"}," +
            "[\"starts-with\", \"$key\", \"\"]," + "{\"acl\": \"private\"}," + "{\"success_action_redirect\": \"" + s3SuccessAction + "\"}," + "[\"starts-with\", \"$Content-Type\", \"\"]," +
            "{\"x-amz-storage-class\": \"ONEZONE_IA\"}," +
            "[\"content-length-range\", 0, 10485760]" +                                 // 10 MB max file up load
            "]" +
        "}";

    policy.replaceAll("\n","").replaceAll("\r","");


    // Encode the policy
    String encPolicy = Base64.getEncoder().encodeToString(policy.getBytes("UTF-8"));

    return encPolicy;
}

पूर्णता के लिए और क्योंकि यह स्पष्ट नहीं है, भंडारण वर्ग मूल्य हैं:

Default: STANDARD

STANDARD | REDUCED_REDUNDANCY | GLACIER | STANDARD_IA | ONEZONE_IA | INTELLIGENT_TIERING | DEEP_ARCHIVE 

यहाँ AWS S3 पोस्ट ऑब्जेक्ट डॉक्यूमेंटेशन है