/* * Copyright 2016 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.getstarted.util; import com.google.cloud.storage.Acl; import com.google.cloud.storage.Acl.Role; import com.google.cloud.storage.Acl.User; import com.google.cloud.storage.BlobInfo; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import org.apache.commons.fileupload.FileItemStream; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; // [START example] public class CloudStorageHelper { private final Logger logger = Logger.getLogger(CloudStorageHelper.class.getName()); private static Storage storage = null; // [START init] static { storage = StorageOptions.getDefaultInstance().getService(); } // [END init] // [START uploadFile] /** * Uploads a file to Google Cloud Storage to the bucket specified in the BUCKET_NAME * environment variable, appending a timestamp to end of the uploaded filename. */ public String uploadFile(FileItemStream fileStream, final String bucketName) throws IOException, ServletException { checkFileExtension(fileStream.getName()); DateTimeFormatter dtf = DateTimeFormat.forPattern("-YYYY-MM-dd-HHmmssSSS"); DateTime dt = DateTime.now(DateTimeZone.UTC); String dtString = dt.toString(dtf); final String fileName = fileStream.getName() + dtString; // the inputstream is closed by default, so we don't need to close it here @SuppressWarnings("deprecation") BlobInfo blobInfo = storage.create( BlobInfo .newBuilder(bucketName, fileName) // Modify access list to allow all users with link to read file .setAcl(new ArrayList<>(Arrays.asList(Acl.of(User.ofAllUsers(), Role.READER)))) .build(), fileStream.openStream()); logger.log(Level.INFO, "Uploaded file {0} as {1}", new Object[]{ fileStream.getName(), fileName}); // return the public download link return blobInfo.getMediaLink(); } // [END uploadFile] // [START checkFileExtension] /** * Checks that the file extension is supported. */ private void checkFileExtension(String fileName) throws ServletException { if (fileName != null && !fileName.isEmpty() && fileName.contains(".")) { String[] allowedExt = { ".jpg", ".jpeg", ".png", ".gif" }; for (String ext : allowedExt) { if (fileName.endsWith(ext)) { return; } } throw new ServletException("file must be an image"); } } // [END checkFileExtension] } // [END example]