2016-05-16 105 views
0

我想从lambda函数中的aws s3桶中获取图像,我想压缩此图像并将其上传回aws s3的目标桶。我试图从S3获取文件和压缩它。但是面临的问题,在上传的压缩文件在java中使用s3和lambda的图像压缩

+1

请包括一个堆栈跟踪,或其他相关的错误信息,所以我们可以看到发生了什么。 – Matt

回答

0

最后这个工作

public class TempComp implements RequestHandler<S3Event, String> { 

    private static final float MAX_WIDTH = 100; 
    private static final float MAX_HEIGHT = 100; 
    private final String JPG_TYPE = (String) "jpg"; 
    private final String JPG_MIME = (String) "image/jpeg"; 
    private final String PNG_TYPE = (String) "png"; 
    private final String PNG_MIME = (String) "image/png"; 

    public String handleRequest(S3Event s3event, Context context) { 
     try { 
      S3EventNotificationRecord record = s3event.getRecords().get(0); 

      String srcBucket = record.getS3().getBucket().getName(); 
      // Object key may have spaces or unicode non-ASCII characters. 
      String srcKey = record.getS3().getObject().getKey() 
        .replace('+', ' '); 
      srcKey = URLDecoder.decode(srcKey, "UTF-8"); 

      String dstBucket = srcBucket + "resized"; 
      String dstKey = "resized-" + srcKey; 

      // Sanity check: validate that source and destination are different 
      // buckets. 
      if (srcBucket.equals(dstBucket)) { 
       System.out 
         .println("Destination bucket must not match source bucket."); 
       return ""; 
      } 

      // Infer the image type. 
      Matcher matcher = Pattern.compile(".*\\.([^\\.]*)").matcher(srcKey); 
      if (!matcher.matches()) { 
       System.out.println("Unable to infer image type for key " 
         + srcKey); 
       return ""; 
      } 
      String imageType = matcher.group(1); 
      if (!(JPG_TYPE.equals(imageType)) && !(PNG_TYPE.equals(imageType))) { 
       System.out.println("Skipping non-image " + srcKey); 
       return ""; 
      } 

      // Download the image from S3 into a stream 
      AmazonS3 s3Client = new AmazonS3Client(); 
      S3Object s3Object = s3Client.getObject(new GetObjectRequest(
        srcBucket, srcKey)); 

      InputStream objectData = s3Object.getObjectContent(); 
     //  int b=objectData.read(); 

      // Read the source image 
      BufferedImage srcImage = ImageIO.read(objectData); 
     //  BufferedImage destImage = srcImage; 


      Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); 
      if (!writers.hasNext()) 
       throw new IllegalStateException("No writers found"); 
      ImageWriter writer = (ImageWriter) writers.next(); 
      ByteArrayOutputStream os=new ByteArrayOutputStream() ; 
      ImageOutputStream ios = ImageIO.createImageOutputStream(os); 
      writer.setOutput(ios); 
      ImageWriteParam param = writer.getDefaultWriteParam(); 
      // compress to a given quality 
      param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
      param.setCompressionQuality(0.5f); 
      // appends a complete image stream containing a single image and 
      //associated stream and image metadata and thumbnails to the output 
      writer.write(null, new IIOImage(srcImage, null, null), param); 
      System.out.print("file is compressed"); 


      ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); 

      //InputStream is = new ByteArrayInputStream(retValue); 
      BufferedImage destImage = ImageIO.read(is); 

      ByteArrayOutputStream os1 = new ByteArrayOutputStream(); 
      ImageIO.write(destImage, imageType, os1); 
      InputStream is1 = new ByteArrayInputStream(os1.toByteArray()); 


      // Set Content-Length and Content-Type 
      ObjectMetadata meta = new ObjectMetadata(); 
      meta.setContentLength(os1.size()); 
      System.out.println(os1.size()); 
      if (JPG_TYPE.equals(imageType)) { 
       meta.setContentType(JPG_MIME); 
      } 
      if (PNG_TYPE.equals(imageType)) { 
       meta.setContentType(PNG_MIME); 
      } 

      // Uploading to S3 destination bucket 
      System.out.println("Writing to: " + dstBucket + "/" + dstKey); 
      s3Client.putObject(dstBucket, dstKey, is1, meta); 
      System.out.println("Successfully resized " + srcBucket + "/" 
        + srcKey + " and uploaded to " + dstBucket + "/" + dstKey); 
      return "Ok"; 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 


} 

}