2010-02-19 163 views
13

在我GSP的看法,我有這樣的代碼:如何強制grails下載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> 

我想下載我的CSV文件,並在我的瀏覽器不讀我的CSV文件!
如何強制下載?

在這裏,在我的控制器代碼的一部分:

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

凡在我的代碼中添加這部分強制下載? :

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

回答

23

渲染調用的問題 - 直接寫入響應輸出流:

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

您還可以使用export plugin - 這是你想要什麼,並有一些不錯的額外的代碼這將遵循協會等,以及其他輸出格式。

根據您的要求,可能是更可維護的解決方案。

+0

I」 m解析文件夾中的文件,添加文件名列表「fileResourceInstanceList」。在我看來,每個fileResourceInstanceList我添加一個鏈接到csv文件。導出插件適用於域類,我不確定我可以使用這個有用的插件嗎? – 2010-02-22 16:49:21

+0

嗯,可能不是那種情況下,至少不是沒有修改。 – 2010-02-28 20:44:02

0

這裏是修復:

鑑於(GSP):

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

在控制器:

DEF下載= {

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

}