AWS S3-Postobjekt lehnt zusätzliche Formularfelder ab
Ich versuche, die Speicherklasse eines hochgeladenen Bildes auf einen AWS S3-Bucket festzulegen. Ich habe es funktioniert, außer dass die Speicherklasse zur Anfrage hinzugefügt wird. In der S3 -Postobjektdokumentation wird angegeben, dass es ein Formulareingabefeld mit dem Namen "x-amz-storage-class" geben kann. Wenn Sie es jedoch oder ein anderes Feld hinzufügen, wird ein AWS-Fehler ausgegeben, der darauf hinweist, dass zu viele Eingabefelder für den Post vorhanden sind. Ich habe versucht, es der Objektrichtlinie hinzuzufügen, aber das führt zu einem Richtlinienfehler: "Richtlinienbedingung fehlgeschlagen: [" eq "," $ x-amz-storage-class "," ONEZONE_IA "]". Ich verwende JSP und die Eingabefelder des Formulars werden unten angezeigt. Jede Hilfe wäre dankbar.
<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 ****
Fehler:
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>
Antworten
Ich habe das jetzt arbeiten. Die Richtlinie enthält Felder, die mit den Feldern im Formular übereinstimmen müssen. "x-amz-storage-class" muss sowohl zu den Formularfeldern als auch zur Richtlinie hinzugefügt werden. Ich vermute, dass die verschlüsselte Richtlinie aus Sicherheitsgründen signiert ist, wodurch sie sicher ist und die Formularfelder mit den Richtlinienfeldern übereinstimmen müssen, um sicherzustellen, dass sie nicht geändert wurden. Warum beides gebraucht wird, ist mir ein Rätsel. Der korrigierte Code ist unten:
<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;
}
Der Vollständigkeit halber und weil es nicht offensichtlich ist, sind die Speicherklassenwerte:
Default: STANDARD
STANDARD | REDUCED_REDUNDANCY | GLACIER | STANDARD_IA | ONEZONE_IA | INTELLIGENT_TIERING | DEEP_ARCHIVE
Hier ist die Dokumentation zu AWS S3 Post Object