?
到此 ,我 们 已 经实现 了表 单 文件上 传 的功能,解析后的文件以二 进 制的方式写入到文件系 统 里。但是,有点小小 遗 憾, 请求发送到服务器端后,服务器并不知道请求是以何种字符集进行编码的。这不是一个技术问题,而是整个软件行业中对字符集的编码与转化缺乏一个统一的标准。因此,这个问题留给了开发人员,告诉浏览器,以何种字符集进行编码、在服务器端以何种字符集进行解码。
如果开发人员没有告诉编码,浏览器将以 iso-8859-1作为默认编码。 开发人员告诉浏览器编码后,浏览器根据两个 boundary内的 MIME数据,决定是否对该区块内的内容进行编码,是二进制的内容则忽略,非二进制的需要进行编码。在 JVM中,对于非二进制文件,如文本文件,程序代码对此过程进行了正确的编码设置和解码过程后,程序能得到正确的内容数据,但仍然不能保证最终这些内容以正确的编码方式存储到文件系统上。
因为 JVM在启动的时候,用 file.encoding参数指定 JVM对文件存储及读取的编码,并且,一旦 JVM启动后,此参数不可修改。为什么要因为这个参数,上传文件后还需要再次转换文件内的内容呢,谁也不想做这麻烦的事情。
因此,除了按照指定的编码对文件明进行解码外,还需要对非二进制的文件内容也要进行解码。我们需要一个一步到位的、简单的解决编码问题的方案,是的,我们需要这个简单的方案。
回 顾 前一篇中的 MultiPartFile 类 , 对 其 进 行稍微的改 动 。
public abstract class MultiPartFile {
protected String name;
protected int start;
protected int end;
protected String charset = "iso-8859-1";
public abstract void append(byte[] buff, int off, int len)
throws IOException;
public abstract void close() throws IOException;
// 此处省略其他非重要方法
//...
}
?
?
对于二进制的文件,用 MultiPartBinaryFile表示,继承 MultiPartFile类,用 FileOutputStream来读写文件。
public class MultiPartBinaryFile extends MultiPartFile {
private FileOutputStream fos;
public void append(byte[] buff, int off, int len) throws IOException {
fos.write(buff, off, len);
}
public void close() throws IOException {
fos.close();
}
// 此处省略其他非重要代码
// ..
}
?
?
对 于文本文件,需要指定文件存 储时 ,所采用的 编码 方式。向文件里写入数据 时 ,用指定的 字符集进行编码,为了加快这个速度,这里使用 BufferedWriter类。
public class MultiPartTextFile extends MultiPartFile {
private Writer writer;
public MultiPartTextFile(String name) throws IOException {
super(name);
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(name)));
}
public MultiPartTextFile(String name, String charset) throws IOException {
super(name, charset);
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(name), charset));
}
public void append(byte[] buff, int off, int len) throws IOException {
byte[] wb = new byte[len];
System.arraycopy(buff, off, wb, 0, len);
writer.write(new String(wb, super.charset));
}
public void close() throws IOException {
writer.close();
}
}
?
这两文类封装好后,对以前的分析文件的代码做一下改进。让分析文件的代码自动识别二进制与文本内容。
?
MultiPartFile multiPartFile = null;
// determine the start position of content-type line
int pos = start = BoyerMoore.indexOf(buffer, _CTRF, end);
// determine the line of content-type
start = BoyerMoore.indexOf(buffer, _CTRF, start + _CTRF.length);
byte[] line = new byte[start - pos];
System.arraycopy(buffer, end, line, 0, line.length);
String contentType = new String(line);
if (contentType.indexOf(_TEXT_CONTENT_TYPE_PREFIX) != -1) {
multiPartFile = new MultiPartTextFile(dir + name, encoding);
} else {
multiPartFile = new MultiPartBinaryFile(dir + name);
}
multiPartFile.setStart(start + _CTRF.length * 2);
return multiPartFile;
?
好了,编码的问题就彻底解决了,程序中只要一次指定了编码字符集,就向乱码问题说再见。程序员是不是可以越来越"懒"了:)
?
<原创内容,版权所有,如若转载,请注明出处,不胜感谢!仪山湖>