主界面:
<!--
一、上传文件时,form表单的method属性必须设置为post,不能是get
二、上传文件时,需要在表单属性中添加enctype属性,该属性用于设置表单提交数据的编码方式,
由于文件传至服务器时与一般文本类型的编码方式不同,需要设置为multipart/form-data。
PS:enctype属性共有三个值,如下
1、application/x-www-form-urlencoded,默认值,该属性值主要用于处理少量文本数据的传递,处理二进制数据、非ASCII编码文本时,效率低;
2、multipart/form-data,上传二进制数据,只有使用了multipart/form-data属性值才能完整地传递文件数据;
3、text/plain,主要用于向服务器传递大量文本数据,如电子邮件、发布长篇新闻等。
-->
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
我叫:<input type="text" name="userName">
密码:<input type="password" name="pwd">
<!--<input type="file" name="myFile" multiple>,加上multiple属性,可以一次上传多个文件-->
选择文件:<input type="file" name="myFile" multiple>
<input type="submit" value="上传">
</form>
servlet类:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<String> pList = new ArrayList<String>();
try {
//1 工厂
FileItemFactory fileItemFactory = new DiskFileItemFactory();
//2 核心类
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
//设置字符集编码
servletFileUpload.setHeaderEncoding("UTF-8");
// 设置一个完整请求的最大限制
servletFileUpload.setSizeMax(1024*1024 * 30);
//3 解析request ,List存放 FileItem (表单元素的封装对象,一个<input>对应一个对象)
List<FileItem> list = servletFileUpload.parseRequest(request);
//4 遍历集合获得数据
for (FileItem fileItem : list) {
if(fileItem.isFormField()){
// 5 是否为表单字段(普通表单元素)
String value = fileItem.getString("UTF-8");
pList.add(value);//将非文件的其他参数放到一个list中,后面可以顺序的去取到
continue;
} else {
//6 上传字段(上传表单元素)
//6.1.表单字段名称 fileItem.getFieldName();
//6.2.上传文件名
String fileName = fileItem.getName();
// * 兼容浏览器, IE : C:\Users\xxx\Desktop\abc.txt ; 其他浏览器 : abc.txt
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
System.out.println(fileName); //上传的文件名会中文乱码,
//切割扩展名(PNG)
int dot = fileName.lastIndexOf('.');
String png=fileName.substring(dot+1);
System.out.println(png);
//允许上传文件
List<String> fileType = Arrays.asList("gif", "png", "jpg");
if (!fileType.contains(png)) { // 判断文件类型是否在允许范围内
System.out.println("上传失败,文件类型只能是gif、png、jpg");
}
//6.3.上传内容
InputStream is = fileItem.getInputStream(); //获得输入流,
String parentDir = this.getServletContext().getRealPath("/smartUpload");
File file = new File(parentDir,fileName);
if(! file.getParentFile().exists()){ //父目录不存在
file.getParentFile().mkdirs(); //mkdirs():创建文件夹,如果上级目录没有的话,也一并创建出来。
}
FileOutputStream out = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = -1;
while( (len = is.read(buf)) != -1){
out.write(buf, 0, len);
}
//关闭
out.close();
is.close();
}
}
String username=pList.get(0);
String pwd=pList.get(1);
System.out.println(username+"\t"+pwd);
request.setAttribute("name", username);
request.setAttribute("pwd", pwd);
request.getRequestDispatcher("showUser.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}