Groovy Grails,如何在Controller的响应中传输或缓冲大文件?

时间:2010-05-13 04:52:49

标签: grails response grails-controller

我有一个控制器,它连接到一个url来检索csv文件。

我可以使用以下代码在响应中发送文件,这很好。

    def fileURL = "www.mysite.com/input.csv"
    def thisUrl = new URL(fileURL);
    def connection = thisUrl.openConnection();
    def output = connection.content.text;

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

但是我认为这个方法不适合大文件,因为整个文件都被加载到控制器内存中。

我希望能够通过chunk读取文件块,并将文件写入响应块。

有什么想法吗?

1 个答案:

答案 0 :(得分:23)

Groovy OutputStreams可以直接使用<<运算符接收InputStream。 OutputStream将使用适当大小的缓冲区自动提取数据。

以下内容应有效复制数据,即使CSV非常大。

def fileURL = "www.mysite.com/input.csv"
def thisUrl = new URL(fileURL);
def connection = thisUrl.openConnection();
def cvsInputStream = connection.inputStream

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