2010-02-19 6 views
13

À mon avis gsp, j'ai ce code:Comment forcer grails à télécharger des fichiers 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> 

Je voudrais télécharger mes fichiers csv, et ne pas lire mes fichiers csv dans mon navigateur!
Comment forcer le téléchargement?

Voici une partie de code dans mon contrôleur:

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

Où ajouter cette partie dans mon code pour forcer le téléchargement? :

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

Répondre

23

L'appel à rendre est le problème - écrire directement au flux de sortie de réponse:

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

Vous pouvez également utiliser le export plugin - il fait ce que vous voulez, et a une belle code supplémentaire cela suivra les associations, etc., ainsi que d'autres formats de sortie.

Peut être une solution plus maintenable en fonction de vos besoins.

+0

I » m analyser des fichiers à partir d'un dossier, ajouter noms de fichiers dans la liste "fileResourceInstanceList". À mon avis pour chaque fileResourceInstanceList j'ajoute un lien vers les fichiers csv. Plugin d'exportation fonctionne avec la classe de domaine, je ne suis pas sûr que je peux utiliser ce plugin utile? –

+0

hmm, probablement pas dans ce cas, du moins pas sans modifications. –

0

Voici le correctif:

Vu (GSP):

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

Contrôleur:

def télécharger = {

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() 

}