Как использовать imgscalr с помощью Grails

Я только начал использовать Groovy и Grails в последние несколько дней. У меня нет опыта работы с Java, поэтому вам придется извинить этот (возможно) очень простой вопрос. Я искал Google и Stack Overflow и не нашел ничего, что помогло бы мне с установкой.

У меня работает загрузка изображений, и я сохраняю файл на сервере. Я использовал учебник IBM Grails, чтобы провести меня через него. Это отлично работает.

Я также хотел бы изменить размер файла в большом, среднем и маленьком формате. Я хотел использовать imgscalr для этого, но я не могу заставить его работать. Я скачал версию 4.2, которая содержит различные файлы.jar. Нужно ли размещать их где-нибудь на сервере и ссылаться на них? Единственное, что я сделал, это добавил эти строки в buildConfig.groovy

dependencies {
    // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.

    // runtime 'mysql:mysql-connector-java:5.1.20'
    compile 'org.imgscalr:imgscalr-lib:4.2'
}

а также import org.imgscalr.Scalr.* в моем PhotoController.Groovy

Вот мой код для сохранения файла на сервере, я также хотел бы изменить размер и сохранить изображение.

def save() {
    def photoInstance = new Photo(params)

    // Handle uploaded file
    def uploadedFile = request.getFile('photoFile')
    if(!uploadedFile.empty) {
        println "Class: ${uploadedFile.class}"
        println "Name: ${uploadedFile.name}"
        println "OriginalFileName: ${uploadedFile.originalFilename}"
        println "Size: ${uploadedFile.size}"
        println "ContentType: ${uploadedFile.contentType}"

        def webRootDir = servletContext.getRealPath("/")

        def originalPhotoDir = new File(webRootDir, "/images/photographs/original")
        originalPhotoDir.mkdirs()
        uploadedFile.transferTo(new File(originalPhotoDir, uploadedFile.originalFilename))

        BufferedImage largeImg = Scalr.resize(uploadedFile, 1366);
        def largePhotoDir = new File(webRootDir, "/images/photographs/large")
        largePhotoDir.mkdirs()

        photoInstance.photoFile = uploadedFile.originalFilename
    }

    if (!photoInstance.hasErrors() && photoInstance.save()) {
        flash.message = "Photo ${photoInstance.id} created"
        redirect(action:"list")
    }
    else {
        render(view:"create", model:[photoInstance: photoInstance])
    }
}

Я получаю ошибку No such property: Scalr for class: garethlewisweb.PhotoController

Я явно делаю что-то очень неправильно. Любое руководство приветствуется.

3 ответа

Это первый результат Google для "Как использовать imgscalr в Grails", и я был удивлен отсутствием информации и примеров при поиске в Google. Хотя первый ответ близок, есть еще несколько ошибок, которые нужно исправить.

Для тех, кто закончил здесь, как я через Google, вот более подробный пример того, как правильно использовать этот хороший плагин:

Сначала объявите плагин в вашем BuildConfig.groovy файл:

dependencies {
    // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.

    // runtime 'mysql:mysql-connector-java:5.1.20'
    compile 'org.imgscalr:imgscalr-lib:4.2'
}

Затем, после установки, просто вставьте этот кусок кода в свой контроллер в действии, которое получает форму из нескольких частей с загруженным изображением.

def create() {

     def userInstance = new User(params)

     //saving image
     def imgFile = request.getFile('myFile')
     def webRootDir = servletContext.getRealPath("/")
     userInstance.storeImageInFileSystem(imgFile, webRootDir)  

     (...) 
}

Внутри моего домена я реализовал это storeImageInFileSystem метод, который изменит размер изображения и сохранит его в файловой системе. Но сначала импортируйте это в файл:

import org.imgscalr.Scalr
import java.awt.image.BufferedImage
import javax.imageio.ImageIO

А затем реализовать метод:

def storeImageInFileSystem(imgFile, webRootDir){

    if (!imgFile.empty)
    {
        def defaultPath = "/images/userImages"
        def systemDir = new File(webRootDir, defaultPath)

        if (!systemDir.exists()) {
            systemDir.mkdirs()
        }

        def imgFileDir = new File( systemDir, imgFile.originalFilename)
        imgFile.transferTo( imgFileDir )

        def imageIn = ImageIO.read(imgFileDir);

        BufferedImage scaledImage = Scalr.resize(imageIn, 200);   //200 is the size of the image
        ImageIO.write(scaledImage, "jpg", new File( systemDir, imgFile.originalFilename )); //write image in filesystem

       (...)
    }
}

Это хорошо сработало для меня. Измените любые детали по мере необходимости, например, системную директорию или размер изображения.

Поместите файл (ы) jar в каталог 'lib' вашего приложения Grails. Затем вы можете удалить эту строку из BuildConfig.groovy

Вместо

import org.imgscalr.Scalr.*

Ты хочешь

import org.imgscalr.Scalr
import javax.imageio.ImageIO

затем resize нужен BufferedImage (глядя на JavaDocs), поэтому попробуйте:

    def originalPhotoDir = new File(webRootDir, "/images/photographs/original")
    originalPhotoDir.mkdirs()
    def originalPhotoFile = new File(originalPhotoDir, uploadedFile.originalFilename)
    uploadedFile.transferTo( originalPhotoFile )

    // Load the image
    BufferedImage originalImage = ImageIO.read( originalPhotoFile )
    // Scale it
    BufferedImage largeImg = Scalr.resize(uploadedFile, 1366);

    // Make the destination folder
    def largePhotoDir = new File(webRootDir, "/images/photographs/large" )
    largePhotoDir.mkdirs()

    // Write the large image out
    ImageIO.write( largeImg, 'png', new File( largePhotoDir, uploadedFile.originalFilename )

Конечно, вам придется следить за файлами, перезаписывающими уже существующие изображения

Другие вопросы по тегам