一、单文件上传:
1.首先前端页面的编写只有一个注意项:就是上传的文件中有图片时更改表单项的entype属性为:enctype="multipart/form-data"
简单说明一下:表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件 上传; 只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
想知道具体为什么的可以百度一下
下面是笔者写的前端jsp页面(特别简陋):
Insert title here昵称:2.servlet的编写:
2.1首先是导包:
> 我们一般情况下使用commons-fileupload-1.3.1.jar这个工具来解析多部件请求。
> fileupload 依赖 commons-io 所以我们要是Filtupload需要同时导入io包。
所以我们需要导入的两个包笔者已经上传到百度云了,需要的朋友可以在这下载(链接:http://pan.baidu.com/s/1c17Ohqw 密码:v3g8)
2.2接下来编写servlet:
先来做一些简单的说明:
DiskFileItemFactory - 工厂类,用于构建一个解析器实例。
ServletFileUpload - 解析器类,通过该类实例来解析request中的请求信息。
FileItem - 工具会将我们请求中每一个部件,都封装为一个FileItem对象,处理文件上传时,只需要调用该对象的方法
- 方法:
boolean isFormField() --> 当前表单项是否是一个普通表单项,true是普通表单项, false是文件表单项
String getContentType() --> 返回的是文件的类型,是MIME值
String getFieldName() --> 获取表单项的name属性值
String getName() --> 获取上传的文件的名字
long getSize() --> 获取文件的大小
String getString(String encoding) --> 获取表单项的value属性值,需要接受一个编码作为参数。
void write(File file) --> 将表单项中的内容写入到磁盘中
(这是我们经常需要用到的一些方法)
> 使用步骤:
1.获取工厂类实例[DiskFileItemFactory]
2.获取解析器类实例[ServletFileUpload]
3.解析request获取FileItem[parseRequest()]
下面是笔者写的一段简短的servlet代码(将上传的文件保存到电脑),希望对大家有写帮助:
protected void doPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {//用于测试前端页面是否与servlet连接好
System.out.println("连接没问题");//工厂类
DiskFileItemFactory dfif = newDiskFileItemFactory();//用于文件上传
ServletFileUpload fileupload = newServletFileUpload(dfif);//设置文件大小(单个文件大小限制100k)
fileupload.setFileSizeMax(1034 * 100);try{//获取前端上传的文件
List fileList =fileupload.parseRequest(request);for(FileItem item : fileList) {if(item.isFormField()) {//普通表单项(也就是jsp页面中name="Name"中的内容)
String name =item.getFieldName();
String value= item.getString("utf-8");
System.out.println(name+ ":" +value);
}else{//文件表单项
long size =item.getSize();//文件的下载位置C:/Users/TYD/Desktop/123.jpg并命名为123.jpg
String path = "C:/Users/TYD/Desktop/123.jpg";
File f= newFile(path);try{
item.write(f);
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}catch(FileUploadException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
try和catch是抛出异常
下面这段代码是将上传的文件保存服务器:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
System.out.println("连接没问题");//工厂类
DiskFileItemFactory dfif=newDiskFileItemFactory();//用于文件上传
ServletFileUpload fileupload=newServletFileUpload(dfif);//设置文件大小(单个文件大小限制50k)
fileupload.setFileSizeMax(1034*50);//设置服务器地址
ServletContext servletContext =request.getServletContext();//在服务器创建一个upload文件
String realPath = servletContext.getRealPath("/upload");
System.out.println("realPath"+realPath);
File file= newFile(realPath);//判断文件是否为空
if(!file.exists()){//如果文件不存在,创建文件
file.mkdir();
}try{//获取前端上传的文件
List fileList=fileupload.parseRequest(request);for(FileItem item:fileList){if(item.isFormField()){//普通表单项
String name=item.getFieldName();
String value=item.getString("utf-8");
System.out.println(name+":"+value);
}else{//文件表单项
long size=item.getSize();//获取文件格式//防止上传空文件
if(size ==0){continue;
}
System.out.println("size:"+size);//设置新创建的文件的名字
String contentType =item.getContentType();
String name=item.getName();if(name.contains("\\")){
name= name.substring(name.lastIndexOf("\\")+1);
}
System.out.println("name:"+name);//防止同名文件覆盖
String prefix =UUID.randomUUID().toString();//去除文件中的-
prefix = prefix.replace("-","");
String fileName= prefix+"_"+name;
String fieldName=item.getFieldName();
System.out.println(size+":"+contentType+":--------"+name+":"+fieldName);try{
item.write(new File(realPath+"\\"+fileName));
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}catch(FileSizeLimitExceededException e){
System.out.println("文件大小不可以超过50K");
}catch(FileUploadException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
接下来便是上传多个文件到服务器
protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
System.out.println("连接没问题");//工厂类
DiskFileItemFactory dfif=newDiskFileItemFactory();//用于文件上传
ServletFileUpload fileupload=newServletFileUpload(dfif);//设置多个文件总大小
fileupload.setSizeMax(1024*200);//设置服务器地址
ServletContext servletContext =request.getServletContext();//在服务器创建一个upload文件
String realPath = servletContext.getRealPath("/upload");
System.out.println("realPath"+realPath);
File file= newFile(realPath);//判断文件是否为空
if(!file.exists()){//如果文件不存在,创建文件
file.mkdir();
}try{//获取前端上传的文件
List fileList=fileupload.parseRequest(request);for(FileItem item:fileList){if(item.isFormField()){//普通表单项
String name=item.getFieldName();
String value=item.getString("utf-8");
System.out.println(name+":"+value);
}else{//文件表单项
long size=item.getSize();//获取文件格式//防止上传空文件
if(size ==0){continue;
}
System.out.println("size:"+size);//设置新创建的文件的名字
String contentType =item.getContentType();
String name=item.getName();if(name.contains("\\")){
name= name.substring(name.lastIndexOf("\\")+1);
}
System.out.println("name:"+name);//防止同名文件覆盖
String prefix =UUID.randomUUID().toString();
prefix= prefix.replace("-","");
String fileName= prefix+"_"+name;
String fieldName=item.getFieldName();
System.out.println(size+":"+contentType+":--------"+name+":"+fieldName);try{
item.write(new File(realPath+"\\"+fileName));
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}catch(SizeLimitExceededException e){
System.out.println("总大小不可以超过150k");
}catch(FileUploadException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
好了,关于文件的上传就到这里。希望对大家有些帮助。。。