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