如何强制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文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 4.2.2 中将 CSV 下载到浏览器

PHP 强制下载(CSV)文件

强制使用 PHP 下载文件

如何在将 Excel 工作表另存为 csv 文件时强制在每个字段中加上引号?

如何强制 Text::CSV 将数字存储为文本?

使用 HttpServletResponse 导出文件以供下载的 Grails 错误