我最近几天才开始使用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
我显然做错了什么。任何指导意见。
答案 0 :(得分:3)
这是“如何在grails中使用imgscalr”的第一个谷歌搜索结果,我对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
(...)
}
}
这对我很有用。根据需要更改任何细节,例如系统指令或图像大小。
答案 1 :(得分:1)
而不是
import org.imgscalr.Scalr.*
你想要
import org.imgscalr.Scalr
import javax.imageio.ImageIO
然后resize
需要BufferedImage
(查看the 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 )
当然,您必须注意覆盖现有图像的文件
答案 2 :(得分:1)
将jar文件放在Grails应用程序的'lib'目录中。然后,您可以从BuildConfig.groovy