0

我正在尝试使用 grails 和 jquery 上传几个(一对多)图像。我一直在关注这个帖子,但到目前为止我无法做到。问题是似乎一切都很好,但是当您尝试保存图像(例如创建建筑物)时,它不会保存任何图像。

我认为,问题的关键在于文件类型(图像)的 gsp 参数。这些是到达我的控制器的参数: [name:1, type:1, create:Cear, imagesList[0].data:org.springframework.web.multipart.commons.CommonsMultipartFile@d9278f, imagesList[0]:data :org.springframework.web.multipart.commons.CommonsMultipartFile@d9278f],动作:保存,控制器:建筑]

所以,我认为这些参数对于我想做的事情是错误的。任何想法或示例代码来解决这个问题?谢谢!

我在建筑控制器中的 save() 方法

def save() {
    def buildingInstance = new Building(params)
    if (!buildingInstance.save(flush: true)) {
        render(view: "create", model: [buildingInstance: buildingInstance])
        return
    }                    
        flash.message = message(code: 'default.created.message', args: [message(code: 'building.label', default: 'Building'), buildingInstance.id])
    redirect(action: "show", id: buildingInstance.id)
}

我的域名:

 class Building {

    def Integer type
    def String name

    List images = new ArrayList()    
    static hasMany = [images: Image]

    static constraints = {
        name()
        type() 
    }   

    static mapping = {
        images cascade:"all-delete-orphan"
    }

def getImagesList() {
    return LazyList.decorate(images,FactoryUtils.instantiateFactory(Image.class))
}

}

 class Image {
    def byte[] data 
    static belongsTo = [building: Building]

    boolean deleted 
    static transients = [ 'deleted' ]

    static constraints = { data(maxSize:10000000,required:true,blank:false)  }
 }

我的JSP:

_Images.jsp

<script type="text/javascript">
function addChild() {
var childCount = ${buildingInstance?.images.size()} + 0;
var htmlId = "image" + childCount;
var deleteIcon = "${resource(dir:'images/skin', file:'icon_delete.png')}";
var templateHtml = "<div id='" + htmlId + "' name='" + htmlId + "'>\n";
templateHtml += "<input type='file' id='imagesList[" + childCount + "].data' name='imagesList[" + childCount + "].data' />\n";
templateHtml += "<span onClick='$(\"#" + htmlId + "\").remove();'><img src='" + deleteIcon + "' /></span>\n";
templateHtml += "</div>\n"; 
$("#childList").append(templateHtml);
 childCount++; 
}
</script>

<div id="childList">
    <g:each var="image" in="${buildingInstance.images}" status="i">
        <!-- Render the image template (_image.gsp) here -->
        <g:render template='image'
            model="['image':image,'i':i,'hidden':false]" />
    </g:each>
</div>
<input type="button" value="Add image" onclick="addChild();" />

_image.gsp

<div id="image${i}" class="image-div" <g:if test="${hidden}">style="display:none;"</g:if>>
    <g:hiddenField name='imagesList[${i}].id' value='${image?.id}'/>
    <g:hiddenField name='imagesList[${i}].deleted' value='false'/>

    <input type="file" name="imagesList[${i}].data"  value="${image?.data}" />

    <span class="del-image">
        <img src="${resource(dir:'images/skin', file:'icon_delete.png')}" 
            style="vertical-align:middle;"/>
    </span>
</div>
4

1 回答 1

1

我已经找到错误的地方了。只需将 gsp 中“images”的“imagesList”值更改为域中的名称即可。我关注的帖子似乎是错误的。

于 2012-07-12T00:41:17.970 回答