【发布时间】:2018-05-15 01:52:07
【问题描述】:
我目前正在实现下载上传文件的功能。
该功能运行良好,“另存为”窗口没有出现。
我会附上执行下载功能的代码。
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,“另存为”窗口打开!
对于火狐,“另存为”窗口不会出现。 但是,会打开一个检查窗口,以确定是打开还是保存文件。
这是因为每个浏览器都有的属性吗?
- 为什么我的逻辑上没有出现“另存为”窗口?
- 为什么在我下载文件时,每种浏览器类型都有一个文件下载窗口?
【问题讨论】:
标签: spring file spring-mvc download mime-types