Grails-画像のアップロード、ダウンロード、等比圧縮
4671 ワード
詳細
Grails画像アップロード
画像が大きすぎてメモリが消費されることを防止し、記憶が容易になるように、ファイルが大きすぎる(>1 M)を圧縮することにした. 等比圧縮で、画像サイズは自分で指定できます.画像サイズを変更したくない場合は、w=1920、h=1080などの画面サイズに幅を指定できます.
これまで、ファイルはプロジェクトの/imagesフォルダの下に格納されていたが、ファイルを統一的に管理するには、インタフェース呼び出しにより、画像をBase 64コード転送に変換するファイル管理サービスを生産することができる.
ファイルサーバはBase 64コードを受信し、復号してピクチャを形成して記憶する.
Grails画像アップロード
def upload()
{
def file = request.getFile("file")
if (file.empty)
{
flash.message = message(code: ' ')
redirect(controller: "attachments", action: "create")
}
def fileType = file.getOriginalFilename().split('\\.')[-1]
if (!(fileType in ['jpg', 'png', 'jpeg','pdf', 'doc', 'docx']))
{
flash.message = message(code: ' ')
redirect(controller: "attachments", action: "create")
}
def webrootDir = servletContext.getRealPath("/")
File fileFolder = new File(webrootDir, "images/tempFile.${fileType}")
file.transferTo(fileFolder)
//
def fileSize = request.getContentLength()
if (fileType in ['jpg', 'png', 'jpeg'] && fileSize > 1024 * 1024)
{
def compressImg = fileServerService.compress(fileFolder.getAbsolutePath(), 1920, 1080)
fileFolder = new File(compressImg)
}
}
画像が大きすぎてメモリが消費されることを防止し、記憶が容易になるように、ファイルが大きすぎる(>1 M)を圧縮することにした. 等比圧縮で、画像サイズは自分で指定できます.画像サイズを変更したくない場合は、w=1920、h=1080などの画面サイズに幅を指定できます.
def compress(String fileName, Integer w, Integer h)
{
File file = new File(fileName)
Image img = ImageIO.read(file)
Integer width = img.getWidth(null)
Integer height = img.getHeight(null)
if (width / height > w / h)
{
h = (Integer) (height * w / width)
}
else
{
w = (Integer) (width * h / height)
}
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB)
// Image.SCALE_AREA_AVERAGING、Image.SCALE_SMOOTH
image.getGraphics().drawImage(img.getScaledInstance(w, h, Image.SCALE_SMOOTH),0, 0, null)
File destFile = new File(fileName)
FileOutputStream out = new FileOutputStream(destFile)
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out)
encoder.encode(image)
return fileName
}
これまで、ファイルはプロジェクトの/imagesフォルダの下に格納されていたが、ファイルを統一的に管理するには、インタフェース呼び出しにより、画像をBase 64コード転送に変換するファイル管理サービスを生産することができる.
def upload()
{
// upload
// Base64
FileInputStream inputStream = new FileInputStream(fileFolder)
ByteArrayOutputStream output = new ByteArrayOutputStream()
byte[] fileBytes = new byte[inputStream.available()]
Integer length = 0
while ((length = inputStream.read(fileBytes)) != -1)
{
output.write(fileBytes, 0, length)
}
def encoded = fileBytes.encodeBase64().toString()
// , ( + )
def fileName = fileServerService.uploadServer(encoded, fileType)
}
ファイルサーバはBase 64コードを受信し、復号してピクチャを形成して記憶する.
def uploadServer()
{
def encoded = params["encoded"]
def fileType = params["fileType"]
def externalId = UUID.randomUUID().toString()
def fileName = "images/${externalId}.${fileType}"
def webrootDir = servletContext.getRealPath("/")
BASE64Decoder decoder = new BASE64Decoder()
byte[] image = decoder.decodeBuffer(encoded)
File fileImage = new File(webrootDir, fileName)
fileImage.append(image)
render externalId as JSON
}
def removeServer()
{
def externalId = params["externalId"]
def fileType = params["fileType"]
def webrootDir = servletContext.getRealPath("/")
def fileName = "images/${externalId}.${fileType}"
File file = new File(webrootDir, fileName)
if (file.isFile() && file.exists())
{
file.delete()
render status: 200
}
}