【问题标题】:Automatic spaces insert during Struts2 downloadStruts2 下载期间自动插入空格
【发布时间】:2016-08-09 14:06:22
【问题描述】:

我想要做什么:

在服务器端生成一个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>

什么不起作用:

当我点击触发动作的链接时,实际上下载了一个名为“id_opp.txt”的文件,它包含所有文本(“toto”),但它在每个字符前添加了一个空格。

“到了”

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

有什么想法吗?


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

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


感谢 Thomas 解决:

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

为“res”变量构建一个输入流,使用实际编码等...

【问题讨论】:

  • 这可能是编码问题,因为您没有提供任何内容。除此之外,您使用的是什么StringInputStream 课程? AFAIK 它不是 struts 2 核心库,也不是 JDK 类。你的例子正确吗?您以小写形式传递t,但以大写形式传递它?
  • 我将使用这些详细信息编辑问题,以便任何人也可以看到它们!
  • @Thomas 大写的 T 是一个错字,我的错。尝试使用 ByteArrayInputStream 来解决这个问题,这似乎是构建我的 InputStream 的更好方法,我会在几分钟内通知您
  • @Thomas 感谢您的评论已修复!这样做的好方法是“fileInputStream = new ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8));” ,所以这是编码和 StringInputStream 的使用的混合,这显然是原因!如果您可以将其添加为官方答案,我会给您赏金!非常感谢

标签: java text download inputstream


【解决方案1】:

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

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

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

像你一样做,即使用ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8)),至少可以解决写作时的问题。然后,即使 BOM 丢失,编辑人员也可能正确解释数据(UTF-8 代表 ISO-Latin 1 (ASCII) 等常见字符,因此即使阅读器中的“错误”编码也可能不是问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多