package de.anycook.upload.imagesaver; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.PutObjectResult; import de.anycook.conf.Configuration; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; /** * @author Jan Graßegger<jan@anycook.de> */ public class AmazonS3ImageSaver extends ImageSaver { private final AmazonS3Client s3Client; private final String bucketName; private final Logger logger; private final String subPath; public AmazonS3ImageSaver(String subPath) { logger = LogManager.getLogger(getClass()); AWSCredentials awsCredentials = new BasicAWSCredentials(Configuration.getInstance().getImageS3AccessKey(), Configuration.getInstance().getImageS3AccessSecret()); s3Client = new AmazonS3Client(awsCredentials); bucketName = Configuration.getInstance().getImageS3Bucket(); this.subPath = subPath; } @Override public void save(String path, String fileName, BufferedImage newImage) throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(newImage, "png", os); byte[] bytes = os.toByteArray(); save(path, fileName, bytes); } @Override public void save(String path, String fileName, byte[] bytes) { byte[] md5 = DigestUtils.md5(bytes); InputStream is = new ByteArrayInputStream(bytes); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(bytes.length); //setting max-age to 15 days metadata.setCacheControl("max-age=1296000"); metadata.setContentMD5(new String(Base64.encodeBase64(md5))); PutObjectRequest request = new PutObjectRequest(bucketName, subPath + path + fileName, is, metadata); request.setCannedAcl(CannedAccessControlList.PublicRead); PutObjectResult result = s3Client.putObject(request); logger.debug("Etag:" + result.getETag() + "-->" + result); } }