`
Mojarra
  • 浏览: 130799 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

文件上传的秘密(二)向编码问题说再见

 
阅读更多

 

到此 ,我 经实现 了表 文件上 的功能,解析后的文件以二 制的方式写入到文件系 里。但是,有点小小 憾, 请求发送到服务器端后,服务器并不知道请求是以何种字符集进行编码的。这不是一个技术问题,而是整个软件行业中对字符集的编码与转化缺乏一个统一的标准。因此,这个问题留给了开发人员,告诉浏览器,以何种字符集进行编码、在服务器端以何种字符集进行解码。


如果开发人员没有告诉编码,浏览器将以 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;
 

好了,编码的问题就彻底解决了,程序中只要一次指定了编码字符集,就向乱码问题说再见。程序员是不是可以越来越"懒"了:)

 

<原创内容,版权所有,如若转载,请注明出处,不胜感谢!仪山湖>

分享到:
评论

相关推荐

    读取创建CSV文件并自动解析文件编码方式

    我们将使用Java语言进行示例,同时引入第三方库来辅助处理编码问题。 首先,创建CSV文件的基本过程涉及将数据写入具有特定分隔符(通常是逗号)的文本文件中。在Java中,我们可以使用内置的`java.io`或Apache ...

    显示任意文件二进制编码的程序

    显示任意文件二进制编码的程序,对励志研究机器码的同学能够提供帮助!

    java 文件编码转换

    标题"java 文件编码转换"指的是使用Java来解决文件编码问题,而描述中提到的"提供一个jar包和一个java文件"则暗示了我们可以通过这两个文件实现这个功能。 首先,`chardet.jar`可能是一个字符集检测库,用于自动...

    文本文件与二进制文件

    文本文件和二进制文件是计算机存储中的两种基本文件类型,它们的区别在于逻辑上的编码方式不同。文本文件适合存储文本数据,二进制文件适合存储多媒体数据。在实际应用中,需要根据具体情况选择合适的文件类型和编码...

    解析URL和文件的编码方式

    在IT行业中,编码方式是构建网络通信和存储数据的基础,特别是在处理URL(统一资源定位符)和文件时。本文将深入解析URL和文件的编码方式,以帮助理解这些概念及其在实际工作中的应用。 首先,URL是互联网上访问...

    文件转换为Base64编码

    Base64编码是一种在互联网上常见的数据编码方式,主要用于在不支持二进制传输的环境(如邮件系统)中传输二进制数据。它将任意的二进制数据转化为可打印的ASCII字符序列,以便在文本格式下进行传输和存储。这种编码...

    文件编码转换工具

    文件编码是计算机处理文本的一种方式,它决定了字符与二进制数据之间的映射关系。不同的编码格式有不同的字符集和编码规则,例如GBK、UTF-8等。在处理跨平台或跨语言的文件时,文件编码的不一致可能导致乱码问题,...

    C#获取文件编码(可以获取子目录下的文件)

    不同的编码方式决定了文件中字符的二进制表示,如果处理不当,可能导致乱码、无法读取等问题。 在C#中,我们可以利用System.IO命名空间中的StreamReader类来尝试识别文件的编码。StreamReader有一个构造函数允许...

    用java修改文件的编码

    不同的编码可能导致在读取或写入文件时出现乱码问题。 2. **`java.nio`包中的Charset类**:Java标准库提供了`java.nio.charset`包,其中的`Charset`类用于表示字符集,提供对各种字符编码的支持。例如,`...

    基于C++文件的哈夫曼编码与解码.zip

    显示每个字符以一个字节进行二进制编码后的编码文件 实现步骤可分为: 统计被编码文件中个字符出现的频数,即统计权重 根据权重,构造哈夫曼树,进行哈夫曼编码 读取文件进行二进制编码 读取文件,将每个字符匹配...

    判断上传的文件编码方式-支持各种编码方式

    判断上传的文件编码方式-支持各种编码方式,GB2312、utf-8、gbk、utf-16...

    文件下载简单修改了中文编码问题

    标题中的“文件下载简单修改了中文编码问题”指的是在处理文件下载过程中,如何正确处理中文字符的编码,以避免乱码现象。 在计算机系统中,中文字符的编码通常有多种方式,如GBK、GB2312、UTF-8等。不同的编码格式...

    批量文件编码转换工具

    本工具名为"批量文件编码转换工具",专门针对那些需要处理大量文件编码问题的用户,能够有效地节省时间和精力。 GB2312编码,全称“中华人民共和国国家标准汉字编码”,是简体中文字符集的一种标准,主要应用于早期...

    Qt文件编码批量转换

    Qt5.9开发的文件编码转换。该工具我用来在Windows7下面VS2015编译器与MinGW编译器编码转换。MinGW编译器使用UTF-8编码,VS2015使用GB2312编码。 预编译头文件缺失,将头文件替换为 #include #include #include #...

    文件内容替换与文件编码格式转换java源码

    在IT行业中,文件内容的替换和文件编码格式的转换是常见的需求,特别是在处理大量文本文件时。本主题聚焦于如何使用Java源码实现这一功能,尤其是针对Eclipse开发环境中从GBK编码转换到UTF-8编码的过程。下面我们将...

    c++文件解码与编码

    在C++编程中,文件的解码与编码是至关重要的概念,它们涉及到数据的存储、传输和处理。...对于初学者来说,从简单的文本文件读写开始,逐步接触更复杂的二进制数据处理和编码转换,是很好的学习路径。

    linux 查看文件编码

    在Linux系统中,查看文件编码是一项非常基础但...总的来说,理解并掌握在Linux中查看文件编码的方法是每个IT专业人员的必备技能。这不仅可以帮助解决文本处理中的问题,也是保证代码可读性和跨平台兼容性的关键步骤。

    基于二进制的哈夫曼编码的全文件压缩与解压

    在此,我们将深入探讨如何利用基于二进制的哈夫曼编码进行全文件的压缩与解压。 首先,文件压缩的基本步骤是将文件转换为二进制形式。在计算机系统中,所有的数据最终都以二进制的形式存在,因此将文件转换为二进制...

    万能的文件编码转换工具。

    总之,“万能的文件编码转换工具”是处理编码问题的强大助手,尤其对于那些需要跨平台、跨语言操作的用户来说,它能有效提高工作效率,避免因编码不匹配带来的困扰。只需简单几步操作,就能实现各种编码间的自由转换...

    jQuery实现文件编码成base64并通过AJAX上传的方法

    本文实例讲述了jQuery实现文件编码成base64并通过AJAX上传的方法。分享给大家供大家参考,具体如下: 使用AJAX是无法直接上传文件的,一般都是新建个iframe在它里面完成表单提交的过程以达到异步上传文件的效果。 ...

Global site tag (gtag.js) - Google Analytics