Example of generating a presigned post policy which has the condition that only jpeg images + * can be uploaded, and applies the public read acl to each image uploaded, and making the POST + * request: + * + *
{@code + * PostFieldsV4 fields = PostFieldsV4.newBuilder().setAcl("public-read").build(); + * PostConditionsV4 conditions = PostConditionsV4.newBuilder().addContentTypeCondition(ConditionV4Type.MATCHES, "image/jpeg").build(); + * + * PostPolicyV4 policy = storage.generateSignedPostPolicyV4( + * BlobInfo.newBuilder("my-bucket", "my-object").build(), + * 7, TimeUnit.DAYS, fields, conditions); + * + * HttpClient client = HttpClientBuilder.create().build(); + * HttpPost request = new HttpPost(policy.getUrl()); + * MultipartEntityBuilder builder = MultipartEntityBuilder.create(); + * + * for (Map.Entry+ * + * @param blobInfo the blob uploaded in the form + * @param fields the fields specified in the form + * @param conditions which conditions every upload must satisfy + * @param duration how long until the form expires, in milliseconds + * @param options optional post policy options + * @see POST + * Object + */ + PostPolicyV4 generateSignedPostPolicyV4( + BlobInfo blobInfo, + long duration, + TimeUnit unit, + PostFieldsV4 fields, + PostConditionsV4 conditions, + PostPolicyV4Option... options); + + /** + * Generates a presigned post policy without any conditions. Automatically creates required + * conditions. See full documentation for generateSignedPostPolicyV4( BlobInfo blobInfo, long + * duration, TimeUnit unit, PostFieldsV4 fields, PostConditionsV4 conditions, + * PostPolicyV4Option... options) above. + */ + PostPolicyV4 generateSignedPostPolicyV4( + BlobInfo blobInfo, + long duration, + TimeUnit unit, + PostFieldsV4 fields, + PostPolicyV4Option... options); + + /** + * Generates a presigned post policy without any fields. Automatically creates required fields. + * See full documentation for generateSignedPostPolicyV4( BlobInfo blobInfo, long duration, + * TimeUnit unit, PostFieldsV4 fields, PostConditionsV4 conditions, PostPolicyV4Option... options) + * above. + */ + PostPolicyV4 generateSignedPostPolicyV4( + BlobInfo blobInfo, + long duration, + TimeUnit unit, + PostConditionsV4 conditions, + PostPolicyV4Option... options); + + /** + * Generates a presigned post policy without any fields or conditions. Automatically creates + * required fields and conditions. See full documentation for generateSignedPostPolicyV4( BlobInfo + * blobInfo, long duration, TimeUnit unit, PostFieldsV4 fields, PostConditionsV4 conditions, + * PostPolicyV4Option... options) above. + */ + PostPolicyV4 generateSignedPostPolicyV4( + BlobInfo blobInfo, long duration, TimeUnit unit, PostPolicyV4Option... options); + /** * Gets the requested blobs. A batch request is used to perform this call. * @@ -3161,6 +3355,7 @@ HmacKeyMetadata updateHmacKeyState( final HmacKeyMetadata hmacKeyMetadata, final HmacKey.HmacKeyState state, UpdateHmacKeyOption... options); + /** * Gets the IAM policy for the provided bucket. * diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java index 0f38e3827..0e24521eb 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java @@ -50,6 +50,10 @@ import com.google.cloud.Tuple; import com.google.cloud.storage.Acl.Entity; import com.google.cloud.storage.HmacKey.HmacKeyMetadata; +import com.google.cloud.storage.PostPolicyV4.ConditionV4Type; +import com.google.cloud.storage.PostPolicyV4.PostConditionsV4; +import com.google.cloud.storage.PostPolicyV4.PostFieldsV4; +import com.google.cloud.storage.PostPolicyV4.PostPolicyV4Document; import com.google.cloud.storage.spi.v1.StorageRpc; import com.google.cloud.storage.spi.v1.StorageRpc.RewriteResponse; import com.google.common.base.CharMatcher; @@ -72,12 +76,15 @@ import java.net.URI; import java.net.URL; import java.net.URLEncoder; +import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collections; import java.util.EnumMap; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TimeZone; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; @@ -733,6 +740,139 @@ public URL signUrl(BlobInfo blobInfo, long duration, TimeUnit unit, SignUrlOptio } } + @Override + public PostPolicyV4 generateSignedPostPolicyV4( + BlobInfo blobInfo, + long duration, + TimeUnit unit, + PostFieldsV4 fields, + PostConditionsV4 conditions, + PostPolicyV4Option... options) { + EnumMapentry : policy.getFields().entrySet()) { + * builder.addTextBody(entry.getKey(), entry.getValue()); + * } + * File file = new File("path/to/your/file/to/upload"); + * builder.addBinaryBody("file", new FileInputStream(file), ContentType.APPLICATION_OCTET_STREAM, file.getName()); + * request.setEntity(builder.build()); + * client.execute(request); + * }