Grails-画像のアップロード、ダウンロード、等比圧縮

4671 ワード

詳細
    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
    }
}