2012-11-14 82 views
1

我正在使用HDImageService插件for grails來完成縮放用戶上傳的圖像的繁重工作。我創建了ImageService.groovy以保存到我的Amazon S3存儲桶。一切工作正常,用戶選擇文件,點擊發布和wahla圖像縮放,存儲和顯示。我的問題是,我不知道如何限制用戶上傳圖片以外的文件。我只想允許上傳jpeg,jpg,gif或png類型的文件。我用這些變量創建了一個ENUM類,但我不知道在哪裏或如何實現。任何人都可以點我在正確的方向僅使用枚舉文件上傳指定的內容類型


RegistrationController.groovy:獲取文件並保存到鬥

  if (params.photo) { 
      MultipartFile file = request.getFile('photo') 
      byte[] fileBytes = file.bytes 
      ByteArrayInputStream bais = new ByteArrayInputStream(fileBytes) 
      BufferedImage image = ImageIO.read(bais) 
      def width = image.width 
      def height = image.height 
      def maxWidth = 500 

      // Calculate the ratio that we will need to resize the image 
      double ratio = 1.0f 
      if (width > maxWidth) { 
       def r = maxWidth/width 
       ratio = r < 1.0f ? r : 1.0f 
       bais.reset() 
       fileBytes = hdImageService.scale(bais, maxWidth, Math.round(height * ratio) as int) 
      } 

      geolink.custPhoto = imageService.storeS3Image(
       imageService.buildPPJPhotoPath(geolink, file.getOriginalFilename()), 
       fileBytes, 
       file.contentType 
      ) 
     } 

ImageService.groovy:枚舉

String getFormatName(byte[] raw) { 
    try { 
     // Create an image input stream on the image 
     ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(raw)) 

     // Find all image readers that recognize the image format 
     Iterator iter = ImageIO.getImageReaders(iis) 
     if (!iter.hasNext()) { 
      // No readers found 
      log.debug("Unable to get format") 
      return null; 
     } 

     // Use the first reader 
     ImageReader reader = (ImageReader)iter.next() 

     // Close stream 
     iis.close() 

     // Return the format name 
     log.debug("Format: ${reader.getFormatName() }") 
     return reader.getFormatName() 
    } 
    catch (IOException e) { 
     log.warn("Unable to determine image format", e) 
    } 
    // The image could not be read 
    return null; 
} 

ImageFormat getContentType(String filename) { 
    String[] parts = filename.split('\\.') 
    return ImageFormat.valueOf(parts[parts.length - 1].toUpperCase()) 
}} 

    public enum ImageFormat { 
JPEG('image/jpeg', 'jpg'), 
JPG('image/jpeg', 'jpg'), 
PNG('image/png', 'png'), 
GIF('image/gif', 'gif') 

String mimeType 
String extension 

public ImageFormat(String mime, String ext) { 
    this.mimeType = mime 
    this.extension = ext 
} 

}

回答

6

這裏'我是如何做到的。它應該很容易修改爲一個枚舉:

def downloadedFile = request.getFile('imageFile') 
def okContentTypes = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'] 

if (!okContentTypes.contains(downloadedFile.getContentType())) { 
    myDomainInstance.errors.rejectValue("image", "Image type must be one of: ${okContentTypes}") 
} 
+0

謝謝格雷格。當我釋放一些時間時,我會試一試。 –