2010-02-19 2 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

Я m разбор файлов из папки, добавление имена файлов в списке «fileResourceInstanceList». На мой взгляд, для каждого fileResourceInstanceList я добавляю ссылку на файлы csv. Экспорт плагина работает с классом домена, я не уверен, что могу использовать этот полезный плагин? –

+0

Хмм, возможно, не в этом случае, по крайней мере, не без изменений. –

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

}

Смежные вопросы