Grails。将文件上传到临时文件夹,并在gsp中显示它们

问题描述 投票:0回答:1

我的意图是上传图像并将其存储在临时文件夹中。然后,我想在.gsp视图中显示这些图像。我一直试图使其工作的过程是这样的:

首先,从输入中上传文件:

<input id="inputImg" type="file" accept="image/*">

创建文件:

def saveFile(MultipartFile inputImg) {

    def contentType = inputImg.getContentType()
    def originalFilename = inputImg.getOriginalFilename()
    def extension = FilenameUtils.getExtension(originalFilename)

    String tempPath = System.getProperty("java.io.tmpdir") + "/uploads"

    File file = new File("$tempPath/$originalFilename")
    FileUtils.forceMkdirParent(file)
    inputImg.transferTo(file)

    if (contentType == 'application/octet-stream') {
        contentType = MimeTypeUtils.getContentTypeByFileName(originalFilename)
    }

    Path filePath = Paths.get(file.toString())
    Path path = Paths.get(tempPath)
    Path relativePath = path.relativize(filePath)

    Avatar avatar = new Avatar(
            path: relativePath.toString(),
            contentType: contentType,
            name: originalFilename,
            extension: extension
    )
}

一旦存储在temp文件夹中,我找到了此解决方案,但是我不确定这是否是最佳方法。我正在尝试使用base64编码处理图像,然后再将其发送到视图:

def filename = user?.avatar?.name
def file = new File("$tempPath/$filename")
def base64file = file?.readBytes()?.encodeBase64()

最后显示在gsp中:

<img alt="img" src="data:image/*;base64,${base64file}"/>

我想知道是否还有另一种最佳方法来执行此过程,我不知道我是否缺少某些内容,或者这不是管理文件和图像的好方法...

java grails groovy upload multipart
1个回答
0
投票

您正在使用具有Base64编码的嵌入式图像,该图像非常适合显示相对较小的图像(最大5k)。这种方法的优点是,您可以在单个HTTP连接中转储包含图像的页面。

如果图像变得很大(> 1MB),则不能使用缓存和其他不错的功能,因此必须一遍又一遍地通过线路发送数据,这会减慢用户体验。

另一种方法是在单独的请求中交付每个图像。

您可以定义一个控制器动作,例如:

class ImageController {

  def image(String id){
    def file = new File("$tempPath/$id")
    if( !file.exists() )
      render status: 404
    else{
      response.contentType  = 'image/jpeg'
      response.withOutputStream{ it << file.readBytes() }
    }
  }
}

然后在您的GSP中输入:

<img alt="img" src="${g.createLink( controller:'image', action:'image', id:user.avatar.name )}"/>
© www.soinside.com 2019 - 2024. All rights reserved.