2010-02-19 7 views
13

In meiner gsp Ansicht, ich habe diesen Code:Wie erzwinge Grals zum Herunterladen von CSV-Dateien?

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

Ich mag meine csv-Dateien herunterladen und nicht meine CSV-Dateien in meinem Browser lesen!
Wie erzwinge ich den Download?

Hier Codeteil in meinem Controller:

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

Wo dieser Teil in meinem Code hinzufügen Download zu erzwingen? :

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

Antwort

23

Der Aufruf zu machen, ist das Problem - direkt auf den Stream Antwortausgabe schreiben:

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

Sie auch die export plugin verwenden - es tut, was Sie wollen, und hat einige nette Zusatzcode das folgt Assoziationen usw. sowie anderen Ausgabeformaten.

Könnte eine wartungsfreundlichere Lösung je nach Ihren Anforderungen sein. Hier

+0

I‘ m Parsing von Dateien aus einem Ordner, fügen Sie hinzu Dateiname in der Liste "fileResourceInstanceList". Aus meiner Sicht füge ich für jede fileResourceInstanceList einen Link zu csv-Dateien hinzu. Export-Plugin funktioniert mit Domain-Klasse, ich bin mir nicht sicher, ob ich dieses nützliche Plugin verwenden kann? –

+0

hmm, wahrscheinlich nicht in diesem fall, zumindest nicht ohne änderungen. –

0

ist fix:

In Ansicht (gsp):

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

In Controller:

def downloaden = {

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

}