【问题标题】:Spring MVC outputStreamSpring MVC 输出流
【发布时间】:2013-04-22 00:12:31
【问题描述】:

我的问题是我有一个程序可以制作文件并将其流式传输给用户,我有两个问题:

1)首先如何更改文件名和类型(x.sql)

2) 如果在制作文件时出现异常,我想将用户重定向到错误页面,因为当我们想写入 servlet 中的输出流时,我的方法的返回类型为 void!

我的程序是这样的:

    @RequestMapping(value = "/test/{jobid}")
   public void dumpData(@PathVariable("jobid") long jobid, HttpServletResponse response) {
     try {

        response.setContentType("application/octet-stream");
        ServletOutputStream out = response.getOutputStream();
        String downloadOutput = "";
        // AM I ABLE TO SET FILENAME SO THE USER DOWNLOAD THE FILE WITH THAT NAME ?
        // DOES SETHEADER HELP ME IN THIS CASE ?

        ... (making downloadOutput String by values coming from somewhere)

        out.write(downloadOutput.getBytes("UTF-8"));
        out.flush();
        out.close();
     } catch(SomeException e){
         //WHEN THE RETURN TYPE IS VOID HOW TO REDIRECT USER TO ERROR PAGE IN CASE OF SOME PROBLEM ? 
        //(INFO:)IF WE DEFINE STRING AS RETURN TYPE THE PROGRAM WILL GET EXCEPTION 
     }

【问题讨论】:

  • 一旦您开始将文件内容写入响应,您将无法重定向到错误页面。如果在此之前发生错误,您可以执行response.sendRedirect(url)

标签: spring jakarta-ee servlets spring-mvc


【解决方案1】:

回答你的第一个问题:

response.setHeader( "Content-Disposition", "attachment;filename=" + filename );
//for zip file
response.setContentType("application/zip");

Here 是各种内容类型的 mime 类型列表。

我找到了解决方案here。您可以将返回类型更改为字符串并在出现错误时返回错误视图名称,否则返回 null。我从链接中了解到,返回 null 和返回类型 void 是相似的。

【讨论】:

  • 下载类型是 sql 并且没有从文件中读取,它将通过从某个地方接收数据来创建。 & 我的第二个问题呢? (我编辑了我的问题!)
  • 浏览器使用内容类型来选择默认程序来显示文件。由于您的文件是 .sql,我相信您希望用户保存它或在文本编辑器中打开它,因此“application/octet-stream”或“text/plain”应该可以工作。抱歉,我不是 Spring MVC 方面的专家,但仍在为您找到解决方案。收到后会第一时间回复。
  • 对于第一个问题,您的答案解决了我的问题,第二个问题的答案是“返回 null”,因此不会发生任何事情,页面仍将保留在同一位置,因此请编辑您的答案并添加第二个答案,我将对其进行评分并选择它作为正确答案! ...非常感谢!
【解决方案2】:

是什么阻止您使用 response.sendRedirect(errorPage)?

【讨论】:

  • 因为这个问题是关于流数据 2 用户,当他/她点击下载链接时我们不需要 2 重定向用户并且他们有 2 停留在同一页面但如果有数据流时出现异常 堆溢出等异常,因此我们确实需要将用户重定向到另一个页面,例如错误页面,因为我们的用户必须知道系统内部到底发生了什么,所以我想通了而不是做出方法 void,我们可以将其设为字符串并在这种情况下返回 null,以便对于捕获异常,我们可以简单地重定向到另一个页面,一切都很好!
猜你喜欢
  • 2016-09-06
  • 2014-05-15
  • 2020-02-20
  • 2018-04-28
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多