我目前正在实施下载上传文件的功能。
该功能运行良好,“另存为”窗口不会出现。
我将附加执行下载功能的代码。
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-Disposition”。
我按原样设置,但不会出现“另存为”窗口。 (当我使用Chrome打开浏览器时)
作为记录ContentType的结果,
getContentType >> application/octet-stream;charset=UTF-8
我确认它的设置与上面的日志类似。
我设置错了,“另存为”窗口没有弹出?
如果你能告诉我出了什么问题,我将不胜感激。
哦,还有一个问题。
为了测试这些内容,我尝试从Microsoft Edge浏览器和firefox浏览器下载文件。
对于Edge,“另存为”窗口打开!
对于火狐,不会出现“另存为”窗口。 但是,会打开一个检查窗口,以确定是打开还是保存文件。
这是因为每个浏览器都有属性吗?
答案 0 :(得分:2)
据我所知,打开/另存为对话框默认情况下会发生这种情况。而且我认为,试图逼迫任何事都没有意义。它是一个您无法在客户端更改的浏览器设置。
使用&#39;另存为&#39;对话,只能做两件事。
在当前代码中,我们始终可以指定文件名和扩展名(test.txt,test.jpeg,test.xls,...)
response.setHeader("Content-Disposition","attachment; filename=test.txt");
以下程序适用于每个具有自己设置的浏览器
@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";
}