【问题标题】:How to force grails to download csv files?如何强制grails下载csv文件?
【发布时间】: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());

【问题讨论】:

    标签: grails groovy grails-controller


    【解决方案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()
      

      }

      【讨论】:

        猜你喜欢
        • 2013-06-20
        • 2011-08-28
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多