文件上传
文件上传通常以流的形式上传。
file.jsp(上传界面)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传案例</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/fileUploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username">
头像:<input type="file" name="img">
<input type="submit" value="提交">
</form>
</body>
</html>
FileUploadServlet(上传文件处理代码)
注意代码第二行(@MultipartConfig)不能遗忘
@WebServlet("/fileUploadServlet")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username= req.getParameter("name");
Part part=req.getPart("img");
String header=part.getHeader("content-disposition");
System.out.println("header="+header);
//前面有几位就加几位(文字裁剪处理)
String realname=header.substring(header.indexOf("filename=")+10,header.length()-1);
System.out.println("realname="+realname);
//获取文件真实内容
InputStream inputStream=part.getInputStream();
//WEB-INF目录外界不能直接访问,如果文件机密性强则放这里
//String dir=this.getServletContext().getRealPath("/WEB-INF/file");
//将文件存入web文件下的file文件夹
String dir=this.getServletContext().getRealPath("/file");
File dirfile=new File(dir);
//如果目录不存在则创建
if (!dirfile.exists()){
dirfile.mkdirs();//创建文件
}
//文件流拷贝
File file=new File(dir,realname);
FileOutputStream fileOutputStream=new FileOutputStream(file);
byte[] buf=new byte[1024];
int len;
while ((len=inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,len);
}
fileOutputStream.close();
inputStream.close();
req.getRequestDispatcher("/file/"+realname).forward(req,resp);
}
}
截图:
上传界面
上传完成后
总结:
-
由servlet获取上传的文件对象Part
Part part=req.getPart(“img”); -
获取文件真实内容
InputStream inputStream=part.getInputStream(); -
判断是否有存储的目录 没有则创建
String dir=this.getServletContext().getRealPath("/file");
File dirfile=new File(dir);
//如果目录不存在则创建
if (!dirfile.exists()){
dirfile.mkdirs();//创建文件
} -
在文件夹中创建输出的文件,并将输出流定位到创建的文件
File file=new File(dir,realname);
FileOutputStream fileOutputStream=new FileOutputStream(file); -
将文件输入流写入缓冲区,再将缓冲区的数据写入输出流中 byte[] buf=new byte[1024];
int len;
while ((len=inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,len);
} -
关闭输入输出流
fileOutputStream.close();
inputStream.close();