【问题标题】:Blossom and downloading file from server开花并从服务器下载文件
【发布时间】:2014-11-28 14:24:38
【问题描述】:

我正在尝试下载在服务器上生成的文件。其中一个放在光盘上,而另一些则作为 base64 解码字节 [] 从外部 Web 服务下载。

但是当我这样做时 FileCopyUtils.copy(new FileInputStream(dFile), response.getOutputStream());

下载的文件已损坏,因为它包含当前页面的 html 代码。有没有用 Blossom 下载文件的“特殊”方式?

问候

【问题讨论】:

    标签: spring-mvc download magnolia


    【解决方案1】:

    不太确定您要做什么。所以你说你把文件dFile 转储到你从HttpServletResponse 获得的输出流?

    它不起作用的原因有很多。您的组件可能在某个页面内,因此很有可能已经有一些东西写入了输出流。此外,您还没有在任何地方提到您是否正确设置了响应标头以指示您正在发回文件。 IMO 最简单的解决方法是创建一个自定义 servlet,将其与其他 servlet 放在链中,然后从那里发送文件,而不是从组件发送文件。例如看一下DamDownloadServlet,特别是它的handleResourceRequest () 方法。

    HTH, 一月

    【讨论】:

      【解决方案2】:

      感谢您的回复。这可能很难做到,因为我需要用一些数据填充页面并下载文件。所以我需要调用当前组件。你是对的 - 这是开花组件,它被放置在其他页面内。所以输出流中有一些东西。

      这是我的代码。如您所见,我设置了正确的 ContentType。

      ServletContext context = RequestContextUtils.getWebApplicationContext(request).getServletContext();
                  String mimetype = context.getMimeType(dFile.getAbsolutePath());
                  response.setContentType(mimetype != null ? mimetype : "application/pdf");
                  response.setContentLength(new Long(dFile.length()).intValue());
                  response.setHeader("Content-Disposition", "attachment; filename=\""+dFile.getName()+"\"");
                  try {
                      FileCopyUtils.copy(new FileInputStream(dFile), response.getOutputStream());
                  } catch (FileNotFoundException e) {
                      logger.error(e);
                  } catch (IOException e) {
                      logger.error(e);
                  }
      

      问候 一月

      【讨论】:

      • 您在那里所做的只是返回 pdf,而不是在页面中写入内容并发送文件。只有在尚未对响应做出任何承诺的情况下,它才会起作用。为确保没有提交任何内容,您可以使用开花功能来预执行您的模型,以便在渲染开始之前调用它,您可以尝试抑制其他所有内容。
      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2017-07-06
      • 2019-03-26
      相关资源
      最近更新 更多