InputStream不保留UserDefinedFileAttributeView属性

时间:2016-02-24 09:16:44

标签: java

我希望用户每次登录时都会下载一个新的模板文件,因此我正在考虑为该文件设置一个用户定义的属性,该文件将保留在会话中并在以后尝试上传该文件时显示错误消息会话。

对于用户定义的属性,我正在使用时间戳。但是,一旦我将文件转换为输入流,用户就可以下载属性。

编辑:我希望用户将获得的文件然后在同一会话中上传,以保留我存储在自定义属性" user.timestamp"中的时间戳。但是到达用户的文件没有任何自定义属性。

        File templateFile = new File(context.getRealPath("resources") + "/downloads/template.xlsx");
        Path filePath = Paths.get(templateFile.getAbsolutePath());

        UserDefinedFileAttributeView view = Files
                .getFileAttributeView(filePath, UserDefinedFileAttributeView.class);

        view.write("user.timestamp",
                    Charset.defaultCharset().encode(timestamp.toString()));



        InputStream fileStream = new FileInputStream(templateFile);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename=Template.xlsx");
        IOUtils.copy(fileStream, response.getOutputStream());
        response.flushBuffer();

1 个答案:

答案 0 :(得分:0)

您实际上将模板文件的内容 复制到servlet响应中。正如javadoc所说的那样:

  

将字节从InputStream复制到OutputStream

您的代码有效,因此您复制文件,只复制其内容

事实上,在servlet响应中,您没有发送文件,而是发送一个字节流,然后由浏览器将其解释为Excel文件。 Content-Disposition仅适用于您的浏览器,例如这个:https://support.microsoft.com/en-us/kb/260519

  

当Internet Explorer收到标题时,它会引发“文件下载”对话框,其文件名框会自动填充标题中指定的文件名。

然后,您的浏览器“从头开始”创建磁盘上的文件。

“简单地按传输文件”的想法是矛盾的 - 文件元数据具有基于每个操作系统的不同格式和结构。

顺便说一下,你所做的不是线程安全的。您正在为单个用户设置全局文件属性 - 如果其他用户在此期间创建了另一个会话,该怎么办?

您可以使用cookie将此信息存储在用户的浏览器中,然后每个后续请求都会将cookie作为每个后续请求的一部分发送给您,或者您应该在业务逻辑层面上解决,这超出了范围这个问题:)为此制定一个全新的问题,不是基于技术,而是基于您的用例。类似的事情:“我需要实现这一点,我已经尝试过这个并且它不起作用,是否有模式/算法?”