Grails Groovy, Как Вы передаете потоком или буферизуете большой файл в ответе Контроллера?

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

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

Я хочу смочь считать блок файла блоком и записать файл в блок ответа блоком.

Какие-либо идеи?

13
задан surfitscrollit 14 October 2014 в 07:51
поделиться

1 ответ

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()
23
ответ дан 1 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: