1.准备工作:
准备jar包:

处理文件上传的jar包
下载地址:FileUpload – Home (apache.org)
2.实现文件上传:
2-1准备上传文件的jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/UploadGaiJing" enctype="multipart/form-data" method="post">
<%--enctype="multipart/form-data":指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思--%>
上传用户:<input type="text" name="username"><br>
上传文件1:<input type="file" name="file1"><br>
上传文件2:<input type="file" name="file2"><br>
<input type="submit" value="提交">
</form>
</body>
</html>2-2准备上传完毕的jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>消息提示</title>
</head>
<body>
${message}
</body>
</html>2-3处理文件上传的Servlet
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@WebServlet("/UploadHandleServlet")
public class UploadHandleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
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");
//设置文件上传路径 可自行创建文件
String sevePath="G:/upload";
File file=new File(sevePath);
//判断上传文件的保存的目录是否存在
if (!file.exists()&&!file.isDirectory()){
System.out.println(sevePath+"目录不存在需要创建");
//创建目录
file.mkdir();
// mkdir() 创建此抽象路径名指定的目录
}
//消息提示
String message="";
try{
//使用Apache文件上传组件处理上传步骤
//1.创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//2.创建一个文件上传解析器
ServletFileUpload upload=new ServletFileUpload(factory);
//解决上传文件名中文问题
upload.setHeaderEncoding("utf-8");
//3.判断提交上来的数据和上传表单的数据是否一致
if (!ServletFileUpload.isMultipartContent(request)){
//按照传统方式获取数据
return;
}
//4.使用SerletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个from表单输入的值
List<FileItem> list=upload.parseRequest(request);
for (FileItem item:list){
//如果fileitem中封装的是普通输入项的数据
if (item.isFormField()){
String name=item.getFieldName();
//解决普通项的数据的中文乱码问题
String value=item.getString("utf-8");
System.out.println(name+"="+value);
}else {//如果filename中是上传的文件
//得到上传的文件名称
String filename=item.getName();
System.out.println(filename);
if (filename==null||filename.trim().equals("")){
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename=filename.substring(filename.lastIndexOf("\\")+1);
//获取item中的上传文件的输入流
InputStream in=item.getInputStream();
//创建一个文件输出流
FileOutputStream out=new FileOutputStream(sevePath+"\\"+filename);
//创建一个缓冲区
byte buffer[]=new byte[1024];
//判断输入流中的数据是否已经读完的标识
int len=0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))<0就表示in里数据传输完毕
while ((len=in.read(buffer))>0){
//使用FileOutStream输出流将缓存区的数据写入到指定的目录(savePath + "\\" + filename)当中
out.write(buffer,0,len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();
//删除处理文件上传时生成的临时文件
//item.delete();
message="文件上传成功!";
}
}
}catch (Exception e){
message="文件上传失败!";
}
request.setAttribute("message",message);
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
现在就已经可以进行基本的文件上传了
但!还会存在一些问题
1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录
2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。
3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。
4、要限制上传文件的最大值。
5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。
















