- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JSP文件上传-二进制流详解
JSP文件上传
一、先做选择上传文件页面chose.jsp,比较简单。
代码如下:
关键代码是:form name=Myform action=upfile.jsp method=post enctype=multipart/form-data
选择文件后的上传由upfile.jsp网页来处理;整个表单内容以post方式传递;表单中包含的所有内容,包括文件都会以enctype=multipart/form-data二进制形式传给服务器。
注意JSP网页里不同的编码形式声明:
charset=gb2312表示网页中包含的内容(比如文件)以简体中文编码;
pageEncoding=UTF-8表示JSP网页源代码本身是UTF-8编码。
因为表单form的内容会以二进制形式传到服务器,就必须用charset=gb2312指定这个二进制是以中文简体来编码的,这样传上去以后真正处理上传和存储的upfile.jsp页才能看懂识别中文文件名!
选择文件页面比较简单,关键是编码的申明,必须说清楚,不然到时候中文文件名就会乱码。
二、upfile.jsp页用来接收和处理以二进制形式传给服务器的数据流。
1、二进制数据流的基本信息。
还是用request对象帮我们取从客户端传过来的各种信息,先取二进制数据流的整体长度,就是传过来文件的大小了,单位是字节。
int formDataLength = request.getContentLength();
我们可以设置能接收的最大文件大小,比如下面,就是10M。
int MAX_SIZE = 10*1024*1024;
再取传过来的二进制数据流类型,不知道里面是什么鬼?
String contentType = request.getContentType();
不要紧,我们打出来看看就知道了,out.print编程时非常有用,随时打出来瞅瞅。
out.print(contentType); 会看到下面这个:
主要就是要后面的这个东西
一个表单form可能选了多个文件,全部在一个二进制数据流里面一起传过来,那么文件数据之间都用这个间隔boundary隔开的。通过它才可以在二进制数据流中找到一个文件的开始和结束位置,从而将文件数据正确取出并保存到服务器里。
一个字节的位置错误都会造成文件保存出错!所以文件保存的最关键就是要找准位置,错一个字节都不行。
2、接收传过来的二进制数据流。
用InputStream对象来接收整个传过来的二进制数据:
InputStream in=request.getInputStream();
内存中新建二进制数组,跟整个传过来的二进制数据流一样大小:
byte dataBytes[] = new byte[formDataLength];
将上传的全部二进制数据全部读到(保存到)dataBytes字节数组里:
in.read(dataBytes,0,formDataLength);
in.close();//记得关掉内存中的in对象,回收资源
将上传上来的全部内容由dataBytes字节数组转换为可见的字符串
String file = new String(dataBytes);
3、探析二进制数据流。
继续用我们很厉害的out.print来看看,转换为字符串后的二进制数据流里面到底是些什么东西。
out.print(file.substring(0,1000));
取file字符串的前1000个字符看看里面的基本结构substring(begin,end),就是取begin到end之间的子字符串,begin和end分别是子串起、止位置的下标。
以间隔开始;接着就是文件的基本(包括文件名,类型等);最后看不懂的就是上传文件的二进制内容。文件内容也将会以间隔结束。
因为不同文件编码很复杂,这里我们直接页面展示肯定是乱码(只有txt文本文件才是直接utf-8,gb2312这样编码,其他文件都会自己另外重编,所以用网页直接打开都会是这样的乱码。)
知道间隔是什么样的,知道文件名在哪里,也知道哪些是文件内容。就可以对二进制数据流进行正确截取,实现文件上传和存储了。
4、在二进制数据流中取出文件名、扩展名、间隔字符串。
int fNbg = file.indexOf(filename=\)+10;
找到在file字符串的起始位置!indexof函数就是找子字符串在大字符串中的其实位置的。\是转义字符,\”表示引号,+10是要找到”的位置。从f到”刚好10个字符。
int fNEd = file.indexOf(Content-Type:)-3;
,反引号”在前面3个位置。
文件名的起始位置,结束位置都找到了,就可以取出来了。
String fileName = file.subs
文档评论(0)