1

grails 用の HDImageService プラグインを使用して、ユーザーがアップロードする画像をスケーリングするための重労働を行っています。Amazon S3 バケットに保存する ImageService.groovy を作成しました。すべて正常に動作し、ユーザーがファイルを選択し、公開をクリックすると、画像がスケーリング、保存、表示されます。私の問題は、ユーザーが画像以外のファイルをアップロードすることを制限する方法がわからないことです。タイプが 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
}

}

4

1 に答える 1

6

これが私のやり方です。これを Enum に変更するのは非常に簡単です。

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}")
}
于 2012-11-14T20:44:37.363 に答える