2012-07-11 59 views
0

我試圖用grails和jQuery上傳幾個(一對多)圖像。我一直在關注這個post,但我無法做到這一點。問題是,似乎一切正常,但是當您嘗試保存圖像(例如創建建築物)時,它不會保存任何圖像。一對多圖像grails

我認爲,問題的關鍵在於文件類型(圖像)的gsp params。這些是到達我的控制器的參數: [name:1,type:1,create:Crear, imagesList [0] .data:[email protected]9278f, imagesList [0 ]:data:[email protected]9278f],action:save,controller:building]

所以,我認爲這些參數對於我想做的事情是錯誤的。任何想法,或示例代碼來解決這個問題?謝謝!

我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> 

回答

1

我已經發現它是錯誤的。只需將gsp中的「imagesList」值更改爲域名中的「images」即可。我跟蹤的帖子似乎是錯誤的。