2010-02-19 18 views
13

A mio avviso SPG, ho questo codice:Come forzare grails per scaricare file csv?

<g:each in="${fileResourceInstanceList}" status="i" var="fileResourceInstance"> 

<tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
<td>${fileResourceInstance.decodeURL()}</td> 

<td><a href="${createLinkTo(dir:"/upload_data/datasets/ds"+signalDataInstance.datasetID , file: fileResourceInstance.decodeURL(), absolute:true)}" target="_new">view</a></td> 

<td><g:link action="deleteFile" id="${fileResourceInstance.replace('.','###')}" params="[rs:signalDataInstance.datasetID]" onclick="return confirm('Are you sure?');"> delete </g:link></td> 
</tr> 
</g:each> 

Vorrei scaricare i miei file CSV, e non leggere i miei file csv nel mio browser!
Come forzare il download?

Qui codice parte nel mio controller:

def f = new File("${linkDir}".toString()) 
    if(f.exists()){ 
     f.eachFile(){ file-> 
     if(!file.isDirectory()) 
      fileResourceInstanceList.add(file.name) 
     } 
    } 

dove aggiungere questa parte nel mio codice per forza scaricare? :

response.setHeader("Content-disposition", "attachment; filename=" + file.name + ".csv"); 
render(contentType: "text/csv", text: file.name.toString()); 

risposta

23

La chiamata a rendere è il problema - scrivere direttamente nel flusso di output di risposta:

response.setHeader "Content-disposition", "attachment; filename=${file.name}.csv" 
response.contentType = 'text/csv' 
response.outputStream << file.text 
response.outputStream.flush() 
0

È anche possibile utilizzare il export plugin - si fa ciò che si vuole, e ha qualche bella codice aggiuntivo che seguirà associazioni, ecc., nonché altri formati di output.

Potrebbe essere una soluzione più manutenibile a seconda delle esigenze.

+0

I' m parsing di file da una cartella, aggiungere nomi di file nell'elenco "fileResourceInstanceList". Nella mia vista per ogni fileResourceInstanceList aggiungo un collegamento ai file CSV. Il plugin di esportazione funziona con la classe di dominio, non sono sicuro di poter utilizzare questo utile plugin? –

+0

hmm, probabilmente non in quel caso, almeno non senza modifiche. –

0

Ecco la correzione:

In considerazione (SPG):

<td><g:link action="download" id="${fileResourceInstance}" params="[rs:signalDataInstance.datasetID]" > download </g:link></td> 

In regolatore:

def download = {

def filename = params.id 

def dsId = params.rs 

def webRootDir = servletContext.getRealPath("/") 

def linkDir = "${webRootDir}/upload_data/datasets/ds${dsId}" 

    def file = new File("${linkDir}".toString() + File.separatorChar + filename + ".csv") 

response.setHeader "Content-disposition", "attachment; filename=${file.name}" 
     response.contentType = 'text/csv' 
     response.outputStream << file.text 
     response.outputStream.flush() 

}

Problemi correlati