4

簡単に言うと、ファイルを作成してファイル システムに保存し、そのファイルへのリンクを含むページを作成できますが、すべてを生成する必要がない多くのファイルへのリンクを含むページが必要な場合はどうすればよいでしょうか?

したがって、ユーザーは次のようなリスト ページのリンクをクリックします。

<g:link action="gimmeAFile" id="${myThingieInstance.id}">${fieldValue(bean: myThingieInstance, field: "id")}</g:link>

現在、次のようなコントローラーがあります。

def gimmeAFile = {
  def lotsaLines = []
  //Do a ton of stuff that has lotsaLines.add(resultStrings) all over

  def fileName = "blahblah-${dateOrSomething}.csv"
  def dumbFile = new File('web-app/tmpfiles/'+fileName).withWriter {out ->
    lotsaLines.each{
      out.println it
    }
  }
  [fileName:fileName]
}

そして、実際にファイルをダウンロードするためのリンクがある gimmeAFile.gsp に移動します。

<a href="${resource(dir:'tmpfiles',file:fileName)}">Download Report</a>

ユーザーを追加の画面にドラッグせずにファイルを作成およびダウンロードするリンクをリスト ビューアーに作成するにはどうすればよいですか。注: ファイルを事前に生成することはできないため、まだ存在しないファイルにリンクする方法を見つける必要があります。コントローラーの最後に render() のようなものを考えています。ファイルへのリンクを含むページを作成する代わりに、gimmeAFile コントローラにファイルを提供させることはできますか?

わかりましたので、これを明確にするために、Kalebの答えに基づいて私が最終的に理解したものです。ありがとうございます!

def gimmeAFile = {
  def lotsaLines = []
  //Do a ton of stuff that has lotsaLines.add(resultStrings) all over

  def fileName = "blahblah-${dateOrSomething}.csv"
  def dumbFile = new File('web-app/tmpfiles/'+fileName).withWriter {out ->
    lotsaLines.each{
      out.println it
    }
  }
  def openAgain = new File('web-app/tmpfiles/'+fileName)
  response.setContentType("text/csv")
  response.setHeader("Content-disposition", "filename=${fileName}")
  response.outputStream << openAgain.getBytes()
  response.outputStream.flush()
  return
}
4

2 に答える 2

3

ファイルのバイトを取得して応答に書き出すだけのビューを作成できます。

response.contentType  = 'image/jpeg' // or whatever content type your resources are
response.outputStream << file.getBytes()
response.outputStream.flush()

それがあなたがやろうとしていることですか?

于 2011-06-07T22:26:06.907 に答える