使用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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。