使用Servlet处理一个上传的文件
Servlet中可以使用post请求上传文件,使用getReader()和getInputStream()自己处理,也可以使用getPart()或getParts()封装了一些功能的方法处理,getParts()可以同时上传多个文件。接下来使用四个Demo来练习一下使用方法
一.使用getReader()和getInputStream()
Demo1
选择文件:
//这是Servlet处理部分 importjava.io.DataInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjavax.servlet.ServletException; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; //ServletimplementationclassuploadServlet @WebServlet("/upload") publicclassUploadServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; //@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //读取请求Body byte[]body=readBody(request); //取得所有Body内容的字符串表示 StringtextBody=newString(body,"ISO-8859-1"); //取得上传的文件的文件名(取得路径并分离) Stringfilename=getFilename(textBody); //取得文件内容在Body中的首尾索引 Positionp=getFilePosition(request,textBody); //将内容输出到文件 writeTo(filename,body,p); } //存放索引的类 classPosition{ intbegin; intend; Position(intbegin,intend){ this.begin=begin; this.end=end; } } //读取请求body privatebyte[]readBody(HttpServletRequestrequest)throwsIOException{ intformDataLength=request.getContentLength(); //获得ServletInputStream对象 //getReader()和getInputStream()只能则一调用,否则会抛出IllegalStateException异常 DataInputStreamdataStream=newDataInputStream(request.getInputStream()); byte[]body=newbyte[formDataLength]; inttotalBytes=0; while(totalBytes二.使用getPart()和getInputStream()
Demo2
//HTML代码块上传相片:
//uploadPhotoDemo.java importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjavax.servlet.ServletException; importjavax.servlet.annotation.MultipartConfig; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.Part; //ServletimplementationclassuploadPartDemo //Tomcat中必须设置@MutipartConfig标注才能使用getPart()相关API @MultipartConfig @WebServlet("/uploadPhoto") publicclassuploadPartDemoextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; //@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub //getPart()获取Part对象 Partpart=request.getPart("photo"); Stringfilename=getFilename(part); writeTo(filename,part); } privateStringgetFilename(Partpart){ Stringheader=part.getHeader("Content-Disposition"); //获取完整路径 Stringfilename=header.substring(header.indexOf("filename=\"")+10,header.lastIndexOf("\"")); //filenameaftersubstringis:F:\Entertainment\pictures\e5e893df874df44d99f06bc52504a65c.jpg System.out.println("filenameaftersubstringis:"+filename); //获取文件名 filename=filename.substring(filename.lastIndexOf("\\")+1); //filenameafter2substringis:e5e893df874df44d99f06bc52504a65c.jpg System.out.println("filenameafter2substringis:"+filename); returnfilename; } privatevoidwriteTo(Stringfilename,Partpart)throwsIOException,FileNotFoundException{ InputStreamis=part.getInputStream(); FileOutputStreamfos=newFileOutputStream("F:\\javaeeAroundFiles\\later\\"+filename); byte[]buffer=newbyte[1024]; intlength=-1; while((length=is.read(buffer))!=-1){ fos.write(buffer,0,length); } is.close(); fos.close(); } }这个Demo和第一个代码最大的区别就是,通过getPart()方法获得了Part对象,通过part对象的getHeader()方法指定标头获得对应的值。
在Tomcat中要在Servlet上设置@MultipartConfig才能取得Part对象,否则getPart会得到null
@MultipartConfig含有的属性如下:
- fileSizeThreshold:整数值设置,若上传文件大小超过设置门槛,则先写入缓存文件,默认值为0
- location:字符串设置,设置写入文件时的目录,使用时与write方法一起使用,下一个Demo中演示如何使用,默认是空字符串
- maxFileSize:限制上传文件大小,默认-1L即无限制
- maxRequestSize:限制multipart/form-data请求个数,默认值为-1L
Demo3
使用Part的write方法进行文件的写入,HTML文件查看Demo2注释部分
//uploadPhotoDemo2.java importjava.io.IOException; importjavax.servlet.ServletException; importjavax.servlet.annotation.MultipartConfig; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.Part; //ServletimplementationclassuploadPartDemo2 //设置属性,这里的最后一级不用分隔符,可以与Demo2中writeTo方法的路径做一下对比 @MultipartConfig(location="F:\\javaeeAroundFiles\\later") @WebServlet("/uploadPhoto2") publicclassuploadPartDemo2extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; //@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //文件名中可能有中文字符所以进行编码设置,使用setCharacterEncoding()方法 request.setCharacterEncoding("UTF-8"); Partpart=request.getPart("photo"); Stringfilename=getFilename(part); //使用Part的write方法,写入location指定路径 part.write(filename); } //获取文件名与Demo2相同不放代码 privateStringgetFilename(Partpart){} }若要实现同时上传多个文件则可以使用getParts()方法,获取到的Part对象被保存在一个Collection中
Demo4
文件1:
文件2:
文件3:
importjava.io.IOException; importjavax.servlet.ServletException; importjavax.servlet.annotation.MultipartConfig; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.Part; //ServletimplementationclassuploadPartsDemo @MultipartConfig(location="F:\\javaeeAroundFiles\\later") @WebServlet("/uploadParts") publicclassuploadPartsDemoextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; //@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("UTF-8"); //使用foreach遍历获取每一个Part对象 for(Partpart:request.getParts()){ if(part.getName().startsWith("file")){ Stringfilename=getFilename(part); part.write(filename); } } } //与之前的getFilename()方法相同 privateStringgetFilename(Partpart){ }总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。