我有一个像这样的上传表单(form.gsp):
<html> <head> <title>Upload Image</title> <Meta name="layout" content="main" /> </head> <body> <g:uploadForm action ="upload"> Photo: <input name="photos" type="file" /> <g:submitButton name="upload" value="Upload" /> </g:uploadForm> </body> </html>
我希望用户上传任何图片,当他点击上传按钮时,我需要一些方法来获取控制器操作中的图像并将其传递给视图:
def upload = { byte[] photo = params.photos //other code goes here . . . . }
这会引发错误:
Cannot cast object 'org.springframework.web.multipart.commons.Commonsmultipartfile@1b40272' with class 'org.springframework.web.multipart.commons.Commonsmultipartfile' to class 'byte'
请注意,我不希望这些照片保存在我的数据库中.实际上,一旦完成上传操作,我将处理该图像并在上传视图中显示输出.如果我有一个解决方案,那将是件好事.
提前致谢.
解决方法
如果您要上传文件,请不要将其存储,并将其显示在< img>中.在下一个请求中的另一个视图中,您可以暂时将其存储在会话中:
的grails-app /控制器/ 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 /视图/上传/ form.gsp:
<g:uploadForm action="upload"> <input type="file" name="file"/> <g:submitButton name="Upload"/> </g:uploadForm>
在grails-app /视图/上传/ elsewhere.gsp:
<img src="${createLink(controller: 'upload',action: 'image')}"/>
该文件可用于单个请求(因为我们在显示时将其删除).您可能需要针对错误情况实施一些额外的会话清理.
您可以轻松地调整它以保留多个文件(如果您尝试上传一堆照片上传),但请记住每个文件占用内存.
使用会话的另一种方法是使用MultipartFile#transferTo(File)
将文件传输到磁盘上的临时位置并从那里显示它们.