Groovy Grails, Как вы передаете или буферизуете большой файл в ответе контроллера? - PullRequest
13 голосов
/ 13 мая 2010

У меня есть контроллер, который устанавливает соединение с 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()

Однако я считаю, что этот метод не подходит для большого файла, так как весь файл загружается в память контроллеров.

Я хочу иметь возможность читать фрагмент файла по фрагменту и записывать файл в фрагмент ответа по фрагменту.

Есть идеи?

1 Ответ

23 голосов
/ 13 мая 2010

Groovy OutputStreams может напрямую принимать InputStreams с помощью оператора <<. 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()
...