呼び出されたときに開く/保存ダイアログを開始するために呼び出されることになっている Spring 3 フレームワーク webapp にダウンロードコントローラーを実装しました。
実際に開く/保存ダイアログを開始し、保存は正常に機能します。しかし、[開く] をクリックすると、ファイル名に ".htm" が追加され、すべて間違って開かれます。なんで?
コントローラ:
@RequestMapping("download/downloadFile")
@ResponseBody
public byte[] downloadFile(@RequestParam String fileID, HttpServletResponse response) {
response.setContentType("application/octet-stream");
File file = getFileByID(fileID);
byte[] bytes = FileCopyUtils.copyToByteArray(file);
response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
response.setContentLength(bytes.length);
return bytes;
}
応答ヘッダーを見ると、コンテンツ タイプが text/html であることがわかります。これは、私の設定を application/octet-stream に無視したようです!
Cache-Control no-cache, no-store
Connection close
Content-Disposition attachment; filename="test.txt"
Content-Length 22071
Content-Type text/html
Date Tue, 05 Feb 2013 21:12:20 GMT
Expires Thu, 01 Jan 1970 00:00:00 GMT
Pragma no-cache
Server Apache/2.2.10 (Linux/SUSE)
X-Powered-By Servlet/2.5 JSP/2.1
X-UA-Compatible IE=8, chrome=1
おそらく、web.xml で Spring MVC をセットアップする方法が原因でしょうか?
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
すべてが「.html」で終わる URL にマップされ、ブラウザがそれを見ているのはどこですか?