问题
I have a controller that makes a connection to a url to retrieve a csv file.
I am able to send the file in the response using the following code, this works fine.
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()
However I think this method is inappropriate for a large file, as the whole file is loaded into the controllers memory.
I want to be able to read the file chunk by chunk and write the file to the response chunk by chunk.
Any ideas?
回答1:
Groovy OutputStreams can take InputStreams directly with the <<
operator. The OutputStream will pull the data automatically with an appropriately sized buffer.
The following should efficiently copy the data, even if the CSV is quite large.
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()
来源:https://stackoverflow.com/questions/2824486/groovy-grails-how-do-you-stream-or-buffer-a-large-file-in-a-controllers-respon