【问题标题】:How to make "Save As" window pop up when downloading files in Spring MVC?在 Spring MVC 中下载文件时如何弹出“另存为”窗口?
【发布时间】: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,“另存为”窗口打开!

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

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

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

【问题讨论】:

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


    【解决方案1】:

    据我所知,打开/另存为对话框是默认情况下发生的。而且我认为,试图强迫任何事情是没有意义的。这是您无法在客户端更改的浏览器设置。

    使用“另存为”对话框,只能完成 2 件事。

    • 更改下载文件名、类型、扩展名..
    • 选择下载文件夹

    在当前代码中,我们总是可以指定文件名和扩展名(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";
            }
    

    【讨论】:

    • 我们需要从前端发送一些东西到 HttpServletResponce
    • 此通信是在将数据从服务器发送回前端时进行的。不确定我是否理解您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2017-07-09
    • 2021-05-17
    相关资源
    最近更新 更多