2011-05-24 120 views
6

I'v使用this方法將文件複製到我項目中的文件夾(第一種方法),並且我編輯了它,以便位置存儲在我的'位置'類提交中(見下文)。Grails下載文件

現在我希望能夠在點擊我的視圖中的圖像後下載該文件。我怎樣才能做到這一點 ?

class Submissions { 

    Date dateSub 
    String Location 
    String fileName 

} 

回答

1

你只需要呈現響應中的字節。我們這樣做

def streamFile = { 
    // load the attachment by id passed on params 
    .... 
    response.contentType = attachment.contentType.toLowerCase() 
    response.contentLength = attachment.data.length() 
    // our 'data' field is a Blob, the important thing here is to get the bytes according to 
    // how you get the actual downlaod 
    response.outputStream.write(attachment.data.getBytes(1L, attachment.data?.length() as int)) 
} 
在我們的控制器

,只是創建一個鏈接到的GSP該控制器的方法。根據你的內容類型,瀏覽器會爲你做一些事情。例如,如果您有圖像類型,則會顯示圖像。如果你有一個word文檔,瀏覽器應該爲用戶的系統打開適當的程序。

+1

hm你說的是這裏的字節..這些文件沒有放在數據庫中,只存放在它的位置。你是否正確地考慮了它? – Michael 2011-05-24 12:33:28

+0

@michael如果你在db中存儲路徑,你需要獲得一個File對象,然後獲取字節。 – hvgotcodes 2011-05-24 12:45:21

20

我已經做了類似下面的內容:

假設你的下載頁面有相關的提交情況......

<g:link action="downloadFile" id="${aSubmission.id}"> 
    <img>...etc...</img> 
</g:link> 

然後在控制器(是你的「位置」的文件的路徑? ):

def downloadFile = { 
    def sub = Submissions.get(params.id) 
    def file = new File("${sub.location}/${sub.fileName") 
    if (file.exists()) 
    { 
     response.setContentType("application/octet-stream") // or or image/JPEG or text/xml or whatever type the file is 
     response.setHeader("Content-disposition", "attachment;filename=\"${file.name}\"") 
     response.outputStream << file.bytes 
    } 
    else render "Error!" // appropriate error handling 
} 
+1

它工作,給file.exists錯誤,因爲沒有這樣的方法,它應該是file.exists() – praveen2609 2013-08-02 08:35:50

2

那麼,將下載邏輯封裝在try/catch中並將webrequest設置爲false總是更好。 http://lalitagarw.blogspot.in/2014/03/grails-forcing-file-download.html

def downloadFile() { 
    InputStream contentStream 
    try { 
     def file = new File("<path>") 
     response.setHeader "Content-disposition", "attachment; filename=filename-with-extension" 
     response.setHeader("Content-Length", "file-size") 
     response.setContentType("file-mime-type") 
     contentStream = file.newInputStream() 
     response.outputStream << contentStream 
     webRequest.renderView = false 
    } finally { 
     IOUtils.closeQuietly(contentStream) 
    } 
}