JSP文件上传-二进制流详解.docVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档