Как заставить Grails загружать CSV-файлы? - PullRequest
13 голосов
/ 20 февраля 2010

В моем представлении 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());

Ответы [ 3 ]

24 голосов
/ 20 февраля 2010

Вызов для рендеринга является проблемой - пишите напрямую в поток вывода ответа:

response.setHeader "Content-disposition", "attachment; filename=${file.name}.csv"
response.contentType = 'text/csv'
response.outputStream << file.text
response.outputStream.flush()
0 голосов
/ 23 февраля 2010

Вот исправление:

В поле зрения (gsp):

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

В контроллере:

def download = {

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

}

0 голосов
/ 20 февраля 2010

Вы также можете использовать экспортный плагин - он делает то, что вы хотите, и имеет некоторый приятный дополнительный код, который будет следовать ассоциациям и т. Д., А также другим выходным форматам.

Может быть более приемлемым решением в зависимости от ваших требований.

...