Struts2 下载期间自动插入空格

Automatic spaces insert during Struts2 download

我正在尝试做什么:

在服务器端生成一个txt文件,在客户端下载。 我正在使用 struts 2,这里是代码部分:

AwesomeAction.java

InputStream fileInputStream;

public InputStream getFileInputStream(){
    return fileInputStream;
}

public String execute() {
    res = "toto";
    fileInputStream = new StringInputStream(res); 
    return SUCCESS;
}

struts.xml

<action name="awesomeAction" class="pathtomyawesomeaction">
    <result name="success" type="stream">
              <param name="contentType">text/plain</param>
              <param name="inputName">fileInputStream</param>
              <param name="contentDisposition">attachment;filename="id_opp.txt"</param>
              <param name="bufferSize">1024</param>
    </result>
    <result name="error" type="redirect">/erreur.do</result>
</action>

什么不起作用:

当我点击 link 触发操作时,实际上下载了一个名为 "id_opp.txt" 的文件,它包含所有文本 ("toto") 但它在每个文本之前添加了一个空格特点。

" 至 o 至 "

通过服务器调试,我确定我的变量包含 "toto" 服务器端,所以它一定是我错过的配置...

有什么想法吗?


使用导入org.hsqldb.lib.StringInputStream;对于 InputStream,因为 String 是在 class 中构建的,所以我不能使用 FileInputStream 或其他任何东西,我不知道有任何其他方法可以做到这一点吗?

正在检查编码,一有结果就会更新


感谢 Thomas 解决:

使用 StringInputStream 是问题的根源,而是将其切换为: fileInputStream = new ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8));

为 "res" 变量构建一个 inputStream,使用实际编码等...

由于编码不同,可能会出现此类问题。在内部 Java 使用 16 位字符存储字符串,当您将它们转换为字节表示形式(例如,用于写入流)时,它将使用某种编码(调用者提供的编码或通常是系统的默认编码)编码)。

因此这取决于 StringInputStream 对字符串的处理方式,即它如何将字符串转换为字节以及使用哪种编码(如果有)。

此外,如果您不添加任何信息来指示编码(如 UTF-8 的 BOM(字节顺序标记)),它可能取决于 reader 如何解释 txt 文件。

按照你的做法,即使用ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8)),至少能解决写的时候的问题。编辑器可能会正确解释数据,即使 BOM 丢失(UTF-8 表示常见字符,如 ISO-Latin 1 (ASCII),因此甚至 reader 中的 "wrong" 编码可能不是一个问题)。