Wie grails zu zwingen, CSV-Dateien herunterladen?
-
21-09-2019 - |
Frage
In meiner gsp Ansicht, ich habe diesen Code:
<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 möchte meine csv-Dateien herunterladen und nicht meine CSV-Dateien in meinem Browser lesen!
Wie Download zu erzwingen?
Hier Code Teil in meinem Controller:
def f = new File( "${linkDir}".toString() )
if( f.exists() ){
f.eachFile(){ file->
if( !file.isDirectory() )
fileResourceInstanceList.add( file.name )
}
}
Wenn Sie diesen Teil in meinem Code Kraft Download hinzufügen? :
response.setHeader("Content-disposition", "attachment; filename=" + file.name + ".csv");
render(contentType: "text/csv", text: file.name.toString());
Lösung
Der Aufruf zu machen, ist das Problem - Schreib direkt mit dem Antwortausgabestrom:
response.setHeader "Content-disposition", "attachment; filename=${file.name}.csv"
response.contentType = 'text/csv'
response.outputStream << file.text
response.outputStream.flush()
Andere Tipps
Sie können auch die Verwendung Export-Plugin - es tut, was Sie wollen, und hat einige schön zusätzlicher Code, die Assoziationen folgen, usw., sowie andere Ausgabeformate.
Könnte eine besser verwaltbar Lösung je nach Ihren Anforderungen sein.
Hier ist das Update:
Im Hinblick auf (gsp):
<td><g:link action="download" id="${fileResourceInstance}" params="[rs:signalDataInstance.datasetID]" > download </g:link></td>
Controller:
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()
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow