14

CSVファイルを取得するためにURLに接続するコントローラーがあります。

次のコードを使用して、応答でファイルを送信できます。これは正常に機能します。

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

ただし、ファイル全体がコントローラーのメモリに読み込まれるため、この方法は大きなファイルには適していないと思います。

ファイルのチャンクをチャンクごとに読み取り、ファイルをチャンクごとに応答チャンクに書き込めるようにしたいと考えています。

何か案は?

4

1 に答える 1

23

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()
于 2010-05-13T07:05:47.487 に答える