Groovy 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()

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

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

Любые идеи?

Ответы

Ответ 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()