如何在Spring MVC中下载文件时弹出“另存为”窗口?

时间:2017-12-01 01:18:38

标签: spring file spring-mvc download mime-types

我目前正在实施下载上传文件的功能。

该功能运行良好,“另存为”窗口不会出现。

我将附加执行下载功能的代码。

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,“另存为”窗口打开!

对于火狐,不会出现“另存为”窗口。 但是,会打开一个检查窗口,以确定是打开还是保存文件。

这是因为每个浏览器都有属性吗?

  1. 为什么我的逻辑上没有出现“另存为”窗口?
  2. 下载文件时,为什么会为每种浏览器类型获取文件下载窗口?

1 个答案:

答案 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";
        }