Если вы хотите загрузить файл, а не сохранить его и отобразить его в <img>
в другом представлении в следующем запросе, вы можете временно сохранить его в сеансе:
grails-app/controllers/UploadController.groovy:
def upload = {
def file = request.getFile('file')
session.file = [
bytes: file.inputStream.bytes,
contentType: file.contentType
]
redirect action: 'elsewhere'
}
def elsewhere = { }
def image = {
if (!session.file) {
response.sendError(404)
return
}
def file = session.file
session.removeAttribute 'file'
response.setHeader('Cache-Control', 'no-cache')
response.contentType = file.contentType
response.outputStream << file.bytes
response.outputStream.flush()
}
grails-app/views/upload/form.gsp:
<g:uploadForm action="upload">
<input type="file" name="file"/>
<g:submitButton name="Upload"/>
</g:uploadForm>
grails-app/views/upload/elsewhere.gsp:
<img src="${createLink(controller: 'upload', action: 'image')}"/>
Файл будет доступен для одного запроса (так как мы удаляем его при отображении). Возможно, вам потребуется реализовать дополнительную очистку сеанса в случае ошибок.
Вы можете легко адаптировать это для хранения нескольких файлов (если вы пытаетесь выполнить несколько загрузок фотографий), но имейте в виду, что каждый файл занимает память.
Альтернативой использованию сеанса может быть передача файлов во временную папку на диске с помощью MultipartFile#transferTo(File)
и отображение их оттуда.