I am using the HDImageService plugin for grails to do the heavy lifting for scaling my images that users upload. I have created ImageService.groovy to save to my Amazon S3 bucket. Everything works fine, user chooses file, clicks publish and wahla the image is scaled, stored and displayed. My problem is that I do not know how to restrict the user from uploading files other than images. I would like to only allow files of type jpeg, jpg, gif ,or png to be uploaded. I have created an ENUM class with these variables, but I do not know where or how to implement. Can anyone point me in the right direction
RegistrationController.groovy: Get File and Save to Bucket
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: Enum
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
}
}
Here’s how I do it. It should be pretty easy to modify this into an Enum: