Grails 1.1 文件上传与缩略图生成

在开发Web应用程序时,经常需要上传图片并生成不同尺寸的缩略图以适应不同的显示屏幕。本文将介绍如何在Grails 1.1中使用Dojo插件来实现这一功能。

环境准备

首先,确保Grails环境已经升级到最新版本,即Grails 1.1。这是为了确保兼容性和使用最新的功能。

尝试使用Prototype库

最初,尝试使用Grails内置的Prototype库来实现文件上传功能,但遇到了问题。使用<g:submitRemote/>标签并没有达到预期的效果。在提交给Grails项目组后,Graeme礼貌地告诉这是预期的行为,因为Prototype不支持这种操作。他建议尝试使用Dojo。

安装GrailsDojo插件

按照Graeme的建议,安装了Grails Dojo插件。理论上,安装插件后,只需要在GSP页面中添加<g:javascript library="dojo"/>标签,就可以将Ajax调用从Prototype转换为Dojo。但在案例中,这并没有奏效,出现了多个JavaScript错误。

手动调整Dojo库

为了解决这个问题,手动将dojo.js文件复制到了预期的位置,并继续进行。但在尝试使用Dojo的文件上传支持时,发现插件中包含的Dojo版本似乎落后了。因此,决定移除Dojo插件,并安装了最新版本(1.2.3),然后开始开发解决方案。

添加必要的Dojo依赖

在GSP页面的JavaScript部分,添加必要的Dojo依赖:

<script type="text/javascript" src="${createLinkTo(dir: 'js/dojo', file: 'dojo.js')}" djConfig="parseOnLoad:true, isDebug:true"></script> <g:javascript> dojo.require("dojo.io.iframe"); </g:javascript>

编写使用dojo.io.iframe的函数

使用dojo.io.iframe发送表单:

function submitForm() { dojo.io.iframe.send({ form: 'uploadProductImageForm', load: function(data) { dojo.byId('productImage').innerHTML = data; } }); }

创建文件上传表单

创建文件上传表单:

<g:form name="uploadProductImageForm" method="post" action="uploadProductImage" enctype="multipart/form-data"> <input type="hidden" name="id" value="${productInstance?.id}"/> <input type="file" name="newProductImage"/> <span class="button"> <input class="add" type="button" name="uploadImage" value="Upload Image" onclick="submitForm()"/> </span> </g:form>

创建控制器方法

def uploadProductImage = { def f = request.getFile('newProductImage') if (!f.empty) { def imagePath = grailsApplication.config.store.productImages.location def name = "image" + new Date().getTime() def file = new File("${imagePath}/${originalFilename}") f.transferTo(file) // 进行图片处理(缩放等) ... def writer = new StringWriter() def xml = new MarkupBuilder(writer) xml.html { body { textarea { img(src: resource(dir: grailsApplication.config.store.productImages.webPath, file: product.mediumImage.name), width: '250') } } } render writer.toString() } else { flash.message = 'file cannot be empty' redirect(action: show) } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485