如何强制grails下载csv文件?
Posted
技术标签:
【中文标题】如何强制grails下载csv文件?【英文标题】:How to force grails to download csv files? 【发布时间】:2011-01-18 23:56:39 【问题描述】:在我的 gsp 视图中,我有这个代码:
<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());
【问题讨论】:
【参考方案1】:调用render是问题——直接写入响应输出流:
response.setHeader "Content-disposition", "attachment; filename=$file.name.csv"
response.contentType = 'text/csv'
response.outputStream << file.text
response.outputStream.flush()
【讨论】:
【参考方案2】:您还可以使用export plugin - 它可以满足您的需求,并且有一些很好的附加代码可以遵循关联等以及其他输出格式。
根据您的要求,可能是一个更易于维护的解决方案。
【讨论】:
我正在解析文件夹中的文件,在列表“fileResourceInstanceList”中添加文件名。在我看来,我为每个 fileResourceInstanceList 添加了一个指向 csv 文件的链接。导出插件适用于域类,我不确定我是否可以使用这个有用的插件? 嗯,在那种情况下可能不会,至少在没有修改的情况下不会。【参考方案3】:这里是修复:
在视图中(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()
【讨论】:
以上是关于如何强制grails下载csv文件?的主要内容,如果未能解决你的问题,请参考以下文章