我的意图是上传图像并将其存储在临时文件夹中。然后,我想在.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}"/>
我想知道是否还有另一种最佳方法来执行此过程,我不知道我是否缺少某些内容,或者这不是管理文件和图像的好方法...
您正在使用具有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 )}"/>