2016-06-25 23 views
0

私のExcelファイルを作成するためにajax呼び出しで呼び出される以下のコードを使用しています。ダウンロードボタンをクリックすると、Excelのルートファイルが生成されます。しかし、ユーザーがファイルとして保存/保存するかどうかを確認することはできません。私は、Excelのコンテンツが来るブラウザのレスポンスタブを見ることができます。しかし、私は、名前を付けて保存ダイアログボックスオプションが来るようにしたい。この問題を解決できる以下のコードの修正はありますか?以下はExcelファイルをサーブレット経由でダウンロードする

  final Date date = new Date(); 
      final String generateDate= new SimpleDateFormat("yyyy-MM-dd").format(date); 
      final String filename = form_name+"-extraction-"+generateDate.toString()+".xls"; 
      final FileOutputStream fileOutputStream = new FileOutputStream(filename); 
      workbook.write(fileOutputStream); 
      downloadFile(filename, response); 

ダウンロードファイル方式である:

private void downloadFile(final String fileName, final SlingHttpServletResponse response){ 
     try { 
      final File f = new File(fileName); 
      response.setContentType("application/vnd.ms-excel"); 
      response.setHeader("Content-Disposition", "inline; filename="+fileName); 
      response.setHeader("Pragma", "public"); 
      response.setHeader("Cache-Control", "no-store"); 
      response.addHeader("Cache-Control", "max-age=0"); 
      FileInputStream fin = null; 
      try { 
       fin = new FileInputStream(f); 
      } catch (final FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      final int size = 1024; 
      try { 
       response.setContentLength(fin.available()); 
       final byte[] buffer = new byte[size]; 
       ServletOutputStream os = null; 

       os = response.getOutputStream(); 
       int length = 0; 
       while ((length = fin.read(buffer)) != -1) { 
        os.write(buffer, 0, length); 
       } 
       fin.close(); 
       os.flush(); 
       os.close(); 
      } catch (final IOException e) { 
       e.printStackTrace(); 
      } 
     }catch (final Exception ex){ 
      LOGGER.error("ERROR IS ::: {}",ex.getMessage()); 
    } 

答えて

1

気質タイプは「添付ファイル」(大文字と小文字を区別せずに)に一致した場合、 これは、受信者が
を保存するようにユーザに促す必要があることを示し 応答をローカルで処理するのではなく、(メディアごとに)
タイプ)。

一方、「インライン」(大文字と小文字を区別しない)と一致する場合、 これはデフォルト処理を意味します。したがって、処分タイプ 「インライン」は、ファイル名(下記参照)などの追加の パラメータを使用して拡張された場合にのみ有効です。

未知又は未処理の配置タイプが
受信者が「添付ファイル」と同じように処理しなければならない(また、[RFC2183]、
2.8節を参照)。

はつまり、あなたの

response.setHeader("Content-Disposition", "inline; filename="+fileName); 

コールでそれをダウンロードするのではなく、ファイルを表示するには、ブラウザを強制されています。 「インライン」の代わりに「添付」を使用する必要があります。

response.setHeader("Content-Disposition", "attachment; filename="+fileName); 

詳細はUse of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)をお読みください。

+0

また、Ajaxコールで問題が発生しました。 http://stackoverflow.com/questions/4814877/how-to-download-file-via-ajax-with-http-post-i-e-some-info-in-body。したがって、呼び出しを取得するために隠しフィールドを使用します。 –

+1

@VivekDhiman実際には、ファイルをディスク[FileSaver.js](https://github.com/eligrey/FileSaver.js)に保存できるjavascriptライブラリがあります。大きなファイルで作業する場合は、[StreamSaver.js](https://github.com/jimmywarting/StreamSaver.js)を使用してください。 – Onur

0

以前に検索したデータ出力がExcelで入力された場合は、静的宣言を削除する必要があります。例:

private static hasmap hs = new hashmap(); 
関連する問題