2017-12-01 12 views
1

アップロードされたファイルをダウンロードする機能を現在実装中です。Spring MVCでファイルをダウンロードするときに "名前を付けて保存"ウィンドウをポップアップする方法は?

機能は正常に動作します。[名前を付けて保存]ウィンドウは表示されません。

ダウンロード機能を実行するコードを添付します。

DownLoadView.java

public class DownLoadView extends AbstractView 
{ 
    private File file; 

    public DownLoadView(File file) 
    { 
     setContentType("application/octet-stream"); 
     this.file = file; 
    } 

    @Override 
    protected void renderMergedOutputModel(Map<String, Object> arg0, HttpServletRequest req, HttpServletResponse resp) 
      throws Exception 
    { 
     resp.setContentType(getContentType()); 
     resp.setContentLength((int) file.length()); 
     System.out.println("getContentType >> " + resp.getContentType()); 
     String userAgent = req.getHeader("User-Agent"); 

     boolean ie = userAgent.indexOf("MSIE") > -1; 

     String fileName = file.getName(); 

     if(ie) 
     { 
      fileName = URLEncoder.encode(file.getName(), "utf-8").replaceAll("\\+", "%20"); 
     } 
     else 
     { 
      fileName = new String(file.getName().getBytes("utf-8")).replaceAll("\\+", "%20"); 
     } 

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

     OutputStream out = resp.getOutputStream(); 
     FileInputStream fis = null; 

     System.out.println("resp : " + resp); 

     try 
     { 
      fis = new FileInputStream(file); 
      FileCopyUtils.copy(fis, out); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      if(fis != null) 
      { 
       try 
       { 
        fis.close(); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
       } 
      }  
     } 
     out.flush(); 
    } 
} 

私は、ファイルのダウンロード機能を実装するためにMIME-TYPEとのContent-Typeを研究。その結果、

は、私の知る限り、「名前を付けて保存」機能を実行するには、

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

を伝えることができるように私はあなたの「Content-処分」に設定する必要があることがわかりました。

そのまま設定しますが、[名前を付けて保存]ウィンドウは表示されません。 ContentTypeをのログを取った結果、 (私はChromeでブラウザを開くと)

getContentType >> application/octet-stream;charset=UTF-8 

は、私はそれが上記のログのように設定されていることを確認しました。

何かが間違って設定されていて、[名前を付けて保存]ウィンドウが表示されません。

何が間違っているか教えていただけたらと思います。

ああ、もう1つ質問です。

これらのことをテストするには、Microsoft EdgeブラウザとFirefoxブラウザからファイルをダウンロードしようとしました。

エッジの場合、[名前を付けて保存]ウィンドウが開きます。

fire foxの場合、[名前を付けて保存]ウィンドウは表示されません。 ただし、ファイルを開くか保存するかのチェックウィンドウが開きます。

これは、各ブラウザのプロパティのためですか。

  1. ロジックに[名前を付けて保存]ウィンドウが表示されないのはなぜですか?
  2. ファイルをダウンロードすると、ブラウザの種類ごとにファイルダウンロードウィンドウが表示されるのはなぜですか。

答えて

1

私が知る限り、Open/Save Asダイアログはデフォルトで何が起こるかです。そして私は、何かを強制しようとすることに意味がないと思います。これは、クライアント側で変更できないブラウザ設定です。

[名前を付けて保存]ダイアログでは、2つしか実行できません。

  • ダウンロードファイル名、タイプ、拡張子を変更します。
  • ダウンロードフォルダ現在のコードで

を選択して、我々は常に

response.setHeader("Content-Disposition","attachment; filename=test.txt"); 
(...、test.txtという、test.jpeg、Test.xlsという)ファイル名と拡張子を指定することができます

以下のプログラムは、すべてのブラウザで独自の設定で動作しました

@RequestMapping("/downloadFile") 
public ModelAndView writeFileContentInResponse(HttpServletResponse response) throws IOException { 
FileInputStream inputStream = new FileInputStream("Fullfilepathto/test.txt"); 
response.setHeader("Content-Disposition","attachment; filename=test.txt"); 
     try { 
      int c; 
      while ((c = inputStream.read()) != -1) { 
      response.getWriter().write(c); 
      } 
     } finally { 
      if (inputStream != null) 
       inputStream.close(); 
       response.getWriter().close(); 
     } 
     return "index"; 
     } 
関連する問題