1

これに関してSOについてすでにいくつか質問があることは知っていますが、それらの解決策はどれも機能しませんでした。

divをクリックしようとしています。次に、jQueryがコントローラーにgetリクエストを送信し、最後に静的ファイル(Zip)をダウンロードします。chrome開発ツールを使用すると、リクエストが有効な200として返されていることがわかります。リクエストの応答は、chromeが試みたレンダリングのようですが、zipファイルに含まれているファイルの名前を確認できるので、すべてが正しいことがわかっていることがわかります。

応答ヘッダーは次のとおりです。

Content-Type:application/zip
Content-disposition:attachment;filename=myFile.zip
Date:Thu, 12 Jul 2012 20:18:05 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

私のコントローラーロジック:

    def root = request.getSession().getServletContext().getRealPath("/")

    def file = new File("C:\path\to\my\file")   

    if (file.exists()) { 
        def os = response.outputStream                
        response.setHeader("Content-Type", "application/zip") 
        response.setHeader("Content-disposition", "attachment;filename=${file.name}")

        def bytes = file.text.bytes 
        for(b in bytes) { 
           os.write(b) 
        } 

        os.flush()
                           org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes().renderView = false 
     }

ブラウザが実際にファイルをダウンロードしていない理由がわかりません。コントローラーロジックのさまざまなバリエーションを試しましたが、すべて同じ結果になりました。

私が試したいくつかのこと:

  • Content-Type as'application / octect-stream;'
  • response.outputStream << file.bytes
  • response.outputStream << file.newInputStream()
  • content-lengthを追加しました
  • ストリームの書き込み後にコンテンツタイプを移動する

Grails2.0.4を使用しています

4

2 に答える 2

4

グレッグのコメントは正しいですが、回避策があります。これが私がこれをどのように機能させるかです:

jQuery AJAXファイルダウンロードプラグイン を入手します(jqueryを使用していることを願っています;))

私は代替案を見ましたが、試していません

これは、フォームを動的に構築し、それをコントローラーに投稿することに基づいてHTTPリクエスト(Ajaxではない)を実行しますが、それでもAJAXエクスペリエンスを提供します。これが少し不格好に思える場合はそうですが、これが機能することがわかった唯一の方法です。上記のURLには、潜在的な問題についての議論があります。jQueryで、プラグインを次のように呼び出します。

$("#myDiv").click(function () {
   $.download('${createLink(controller: 'download', action: 'zipFile')}', 'fileName=' + $("#myTextBox").val()); 
});

コントローラーは近くに見えます。すでに試したことを使用すると、機能するはずです。

response.setHeader("Content-Type", "application/zip") 
response.setHeader("Content-disposition", "attachment;filename=${file.name}")
response.outputStream << file.newInputStream()

私はこれをしばらくの間問題なく使用しています(まだ)

于 2012-07-12T23:47:21.127 に答える
1

Chromeはフォーマットに非常に厳密であり、間違った場合は「ヘッダーの重複」エラーが発生する可能性があるため、ヘッダーにcontent-dispositionを設定する場合は、次の点に注意する必要があります:http: //www.intelligrape.com/ blog / 2012/04/11 / duplicate-headers-received-from-server-fix-for-chrome /

于 2012-07-13T07:07:37.213 に答える