2010-02-19 40 views
13

Theo quan điểm của GSP của tôi, tôi có mã này:Làm cách nào để buộc grails tải xuống tệp 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> 

Tôi muốn tải file csv của tôi, và không đọc file csv của tôi trong trình duyệt của tôi!
Làm cách nào để tải xuống?

Dưới đây là một phần mã trong bộ điều khiển của tôi:

def f = new File("${linkDir}".toString()) 
    if(f.exists()){ 
     f.eachFile(){ file-> 
     if(!file.isDirectory()) 
      fileResourceInstanceList.add(file.name) 
     } 
    } 

đâu để thêm phần này trong mã của tôi để buộc tải? :

response.setHeader("Content-disposition", "attachment; filename=" + file.name + ".csv"); 
render(contentType: "text/csv", text: file.name.toString()); 

Trả lời

23

Cuộc gọi để render là vấn đề - viết trực tiếp vào dòng đầu ra phản ứng:

response.setHeader "Content-disposition", "attachment; filename=${file.name}.csv" 
response.contentType = 'text/csv' 
response.outputStream << file.text 
response.outputStream.flush() 
0

Bạn cũng có thể sử dụng export plugin - nó làm những gì bạn muốn, và có một số mã bổ sung đẹp sẽ theo các liên kết, vv, cũng như các định dạng đầu ra khác.

Có thể là giải pháp dễ bảo trì hơn tùy thuộc vào yêu cầu của bạn.

+0

tôi m phân tích tệp từ một thư mục, thêm tập tin tên trong danh sách "fileResourceInstanceList". Theo quan điểm của tôi cho mỗi fileResourceInstanceList tôi thêm một liên kết đến các tập tin csv. Plugin xuất hoạt động với lớp miền, tôi không chắc mình có thể sử dụng plugin hữu ích này không? –

+0

hmm, có thể không phải trong trường hợp đó, ít nhất là không phải không có sửa đổi. –

0

Đây là việc sửa chữa:

Theo quan điểm phổ cập (GSP):

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

Trong điều khiển:

def tải = {

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

}

Các vấn đề liên quan