文件上传
a、引入两个jar包
apache:commons-fileupload组件
commons-fileupload.jar依赖于commons-io.jar组件
b、代码**
显示层前台:jsp**
<input type="file" name="spicture">
注意:
1、表单提交方式必须为post
2、在表单中必须增加一个属性:
enctype=“multipart/form-data”
示例代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
学号:<input type="text" name="sno"><br/>
姓名:<input type="text" name="sname"><br/>
上传照片:<input type="file" name="Spicture"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
显示层后台:servlet
注意上传的目录upload
1、如果修改代码,该目录在tomcat重新启动时会被删除
2、如果不修改代码,则该目录在tomcat重启时不会被删除
原因:Tomcat在运行时只需要由java程序编译成的class文件,在tomcat重启时,class文件就会被重新打包生成一份,upload目录同时也被重新生成一份,旧的upload就会被取代
对应方法
1、构建虚拟目录
2、直接更换上传目录,到非tomcat目录
示例代码:
package my.student.servlet;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
//上传
//isMultipartContent用于检查从jsp上传的表单是否有一个multipart
boolean isMultipart=ServletFileUpload.isMultipartContent(request); //返回值布尔值
if(isMultipart) { //进行上传操作
//DiskFileItemFactory是FileItemFactory的实现类,FIleTtemFactory为接口类
FileItemFactory factory=new DiskFileItemFactory();
//上传用ServletFileUpload对象,ServletFileUpload对象的使用需要一个FielItemFactory对象
ServletFileUpload upload=new ServletFileUpload(factory);
//通过parseRequest解析表单form中所有请求字段,并保存到items集合中(即前台传递的sno sname spicture就保存在items中)
List<FileItem> items=null;
try {
items=upload.parseRequest(request);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//遍历items中的数据获取从表单form中获取的字段
Iterator<FileItem> iter=items.iterator();
while(iter.hasNext()) { //类似于rs
//用FileItem获取下一个字段的值
FileItem item=iter.next();
String itemName=item.getFieldName();
String sno=null;
String sname=null;
//因为从表单中传过来的数据无法区分次序,所以需要用字段名name属性来区分
//除此之外,还需要判断前台字段是普通表单字段还是文件字段
if(item.isFormField()) { //如果是普通表单字段,则需要用字段名属性来区分
if(itemName.equals("sno")) { //说明遍历到sno字段
sno=item.getString("UTF-8"); //获取sno的值
}else if(itemName.equals("sname")){//说明是sname字段
sname=item.getString("UTF-8"); //获取sname的值
}
}else { //如果不是普通表单字段,说明是文件字段
//文件上传处理
//1、文件名 2、文件内容
//getFiledName()是获取普通表单字段的Name值(sno sname spicture)
//getName()是获取文件名
String fileName=item.getName(); //获取文件名
//获取文件内容上传
//定义文件路径:指定上传位置(服务器路径)
//String path="D:\\java程序\\UpAndDown\\WebContent"; //地址和程序耦合性过强,不好
//获取服务器路径,需要用到application方法
String path=request.getSession().getServletContext().getRealPath("upload");
System.out.println(path);
File file=new File(path,fileName); //文件名保持一致
try {
item.write(file);
System.out.println(fileName+"上传成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.print("上传失败!");
} //上传
}
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
控制文件上传类型和大小
文件类型:
通过对文件名小数点"."后字段的控制来控制上传文件类型
示例代码:
String fileName=item.getName();
//判断文件类型
String ext=fileName.substring(fileName.indexOf(".")+1);
if(!ext.equals("png")||!ext.equals("txt")) {
System.out.println("文件只能是png/txt");
return; //终止
}
文件大小示例代码:
//控制上传单个文件的大小:注意一定要写在pareseRequest解析前
//设置上传文件时用到的临时文件的大小
//客户端文件上传到服务端并不是一步到位,而是先把文件传入缓冲区
//需注意,上传文件大小用ServletFileUpload设置
//缓冲区文件大小用FileItemFactory设置
factory.setSizeThreshold(10240); //临时文件10KB
//设置临时文件目录
factory.setRepository(new File("D:\\java程序\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\UAD\\uploadwemp"));
upload.setSizeMax(20480); //单个文件20KB 单位:字节B