`
Mojarra
  • 浏览: 131238 次
  • 性别: 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;
 

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

 

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

分享到:
评论

相关推荐

    文本文件与二进制文件

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

    java 文件编码转换

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

    批量编码转化工具(实现文件编码的自动检测)

    批量编码转化工具正是为了解决这一问题而设计的,它能够自动检测文件的编码,并进行相应的转换,确保数据的一致性和可读性。下面将详细介绍这个工具的工作原理、使用方法以及可能涉及的相关技术。 1. 文件编码的...

    解析URL和文件的编码方式

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

    文件转换为Base64编码

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

    Linux查看文件编码格式及文件编码转换

    ### Linux查看文件编码格式 在Linux环境中,了解文件的编码格式是非常重要的,因为这直接影响到文件的正确读取和处理。下面将详细介绍如何在Linux环境下查看文件编码格式的方法。 #### 使用Vim查看文件编码 Vim是...

    文件编码转换工具

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

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

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

    JAVA获取文件编码格式

    使用cpdetector,开发者可以避免因文件编码不明确而产生的乱码问题,确保程序能正确处理各种类型的文本文件。 在Java中,我们可以按照以下步骤使用cpdetector: 1. **引入依赖**:首先,需要将cpdetector的jar包...

    Linux下查看文件编码,文件编码格式转换和文件名编码.doc

    总结来说,本文介绍了 Linux 中查看文件编码、文件编码转换和文件名编码转换的方法,并对 Vim 的编码方式设置做了详细的介绍。这些知识点对于解决 Linux 和 Windows 之间的文件编码问题非常重要。

    git 修改上传文件编码为utf-8-bom

    当上传文件存在中文时,修改上传文件编码为utf-8-bom

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

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

    C# 编码自动识别 匹配文件当前编码格式

    在编程领域,尤其是在处理文本文件时,正确识别和使用文件的编码格式至关重要。C#作为.NET框架中的主要编程语言,提供了强大的支持来处理各种编码格式。本文将详细讲解"C#编码自动识别匹配文件当前编码格式"这一主题...

    查看文件编码格式Demo

    文件编码格式,如ASCII、UTF-8、GBK等,是用来规定字符集和它们在二进制数据流中表示方式的一种标准。不同的编码格式适用于不同的场景,例如,UTF-8是全球通用的编码,支持多种语言,而GBK是中国大陆常用的编码,...

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

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

    java 获取文件编码

    总的来说,Java提供了丰富的API来处理文件编码问题,但识别未知编码仍然是一个挑战。使用如`EncodingDetect.jar`这样的第三方工具可以帮助我们更准确地识别文件的编码,从而避免乱码问题。在实际操作中,结合使用...

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

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

    批量文件编码转换工具

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

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

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

    c++文件解码与编码

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

Global site tag (gtag.js) - Google Analytics