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" 编码可能不是一个问题)。
我正在尝试做什么:
在服务器端生成一个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" 编码可能不是一个问题)。