2010-02-19 160 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() 

}