文件上传
文件上传要点:
1.导入相应jar包:commons-fileupload.jar和commons-io.jar
2.form表单的method为必须是post方式(因为get方式是通过地址栏传递,能够承载的大小有限),enctype必须是multipart/form-data
1.upload.jsp
<form action="uploadServlet" method="post" enctype="multipart/form-data">
请选择文件:<input type="file" name="file"/><<br>
<<input type="submit" value="提交">
</form>
2.UploadServlet.java
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.首先判断是否为多媒体文件
if(!ServletFileUpload.isMultipartContent(req)){
PrintWriter out = resp.getWriter();
out.println("表单必须包含:enctype='multipart/form-data'");
out.flush();
return;
}else{
//创建工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置内存临界值,超过将存放到临时目录下
factory.setSizeThreshold(1024*1024*3);//3M
//设置临时目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
//将配置好的factory传给servlet的上传处理类
ServletFileUpload upload=new ServletFileUpload(factory);
//中文处理
upload.setHeaderEncoding("UTF-8");
//开始上传
try {
List<FileItem> fileItems = upload.parseRequest(req);
//遍历fileItems
if (fileItems!=null && fileItems.size()>0){
for (FileItem fileItem : fileItems) {
if (!fileItem.isFormField()){
//将上传的文件存储到本地
String fileName=new File(fileItem.getName()).getName();
String filePath="D:\\img"+File.separator+fileName;
File file=new File(filePath);
//将fileItem的内容写到本地存储目录
fileItem.write(file);
req.setAttribute("filename", fileName);
}
}
}
req.getRequestDispatcher("show.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.show.jsp
<img src="/img/<%=request.getAttribute("filename")%>"/> --显示我们本地存储的文件
这里我们需要注意的是:目前已经不许将图片的路径设为绝对路径,也就是图片在硬盘的存储路径。所以我们只能使用虚拟路径,那么我们就要给本地存储目录配置虚拟路径,虚拟路径的配置可以在tomcat的server.xml中配,配置如下:
如果是使用IDEA的话,也可以不在server.xml中配置,可以直接在项目中配,打开Edit Configurations,具体看下图:
4.示例遇到的小问题
在写这个示例的时候遇到一个小问题如下:
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component
原因是只是将外部引入的jar包放到了libraries下,但是artifacts中没有,所以需要在artifacts中再添加一次,具体如下图: