版权声明:@渔闻520 https://blog.csdn.net/weixin_41060905/article/details/82717717
先从http://jakarta.apache.org/commons/fileupload下载到Apache文件上传组件的二进制发行包,文件名为Commons——fileupload-1.3.zip,下载解压后,将jar包拷贝到web—INF下lib文件夹中。
这里还要导入一个包:
commons-io.jar 这个包可以在Apache网站上下载到。该包的作用是可以提供解析,即对parseRequest()方法的支持。
这里注意:
必须使用post方法,因为get请求的数据长度有限。
name属性必须有。
下面上代码:
servlet代码:
package net.book.util;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
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.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
/**
* @Author: JiangYi
* @Date: 2018/9/16 10:04
* @Description:
*/
@WebServlet(name = "FileUploadServlet",urlPatterns = "/fileUploadServlet")
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");//设置返回给浏览器的编码,中文不会乱码
PrintWriter out = response.getWriter();
//设置保存上传文件的目录
String uploadDir="e:/upfile";
out.println("上传文件存储目录!"+uploadDir);
File fUploadDir = new File(uploadDir);
if(!fUploadDir.exists()){
if(!fUploadDir.mkdir()){
out.println("无法创建存储目录"+uploadDir);
return;
}
}
if(!DiskFileUpload.isMultipartContent(request)){
out.println("只能处理mutipart/form-data类型的数据");
return;
}
DiskFileUpload diskFileUpload = new DiskFileUpload();
diskFileUpload.setSizeMax(1024*1024*200);
diskFileUpload.setSizeThreshold(1024*1024);
diskFileUpload.setHeaderEncoding("utf-8");
List <FileItem> fileItems;
try {
fileItems=diskFileUpload.parseRequest(request);
} catch (FileUploadException e) {
out.println("解析数据时出现如下问题:");
e.printStackTrace(out);
return;
}
// out.println("fffffffffffffffff");
//下面通过迭代器逐个将集合中的文件取出,保存到服务器上
Iterator it = fileItems.iterator();
while (it.hasNext()){
FileItem item = (FileItem) it.next();//由迭代器取出文件项
if(!item.isFormField()){//忽略那些不属于文件域的表单信息
String pathSrc = item.getName();
if(pathSrc.trim().equals(" ")) continue;
int start = pathSrc.lastIndexOf("\\");//确定最后\的位置以此来获取不含路劲的文件名
String fileName = pathSrc.substring(start + 1);
File pathDest = new File(uploadDir, fileName);
try {
item.write(pathDest);
} catch (Exception e) {
out.println("存储文件时遇到如下的问题:");
e.printStackTrace(out);
}
finally {
item.delete();
}
}
}
response.sendRedirect("bookstory/fileUpload_list.jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}}
提交文件的代码:
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2018/9/16
Time: 10:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body bgcolor="#ffffff" text="black" marginleft="0" margintop="40" marginwidth="0" marginheight="0">
<center>
<h1>文件上传</h1>
<form name="uploadform" method="post" action="/fileUploadServlet" enctype="multipart/form-data">
<table border="3" width="450" cellpadding="4" cellspacing="2">
<tr>
<td colspan="2">
文件1:<input type="file" name="file1" size="40">
</td>
</tr>
<tr>
<td colspan="2">
文件2:<input type="file" name="file2" size="40">
</td>
</tr>
<tr>
<td colspan="2">
文件3:<input type="file" name="file3" size="40">
</td>
</tr>
</table><br><br>
<table>
<tr>
<td align="center">
<input type="submit" name="submit" value="开始上传"/>
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
查看效果的代码:
<%@ page import="java.io.File" %><%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2018/9/16
Time: 10:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件目录</title>
</head>
<body>
<font size="4" color="red">已上传文件的目录列表</font>
<br>
<font size="5" color="blue">
<%
String path="e:/upfile";
File file = new File(path);
File[] filelist = file.listFiles();
out.println("服务器上传文件的保存路径:"+path+"<br><br>");
for (int i=0;i<filelist.length;i++){
out.println((i+1)+":"+filelist[i].getName()+" <br>");
}
%>
</font>
</body>
</html>
区别普通表单字段和文件表单字段(用 pulbic boolean isFormField()方法)
普通表单字段指的是<input type="text">等这些
而文件表单字段,指的是<input type="file">
另外,保存在文件夹下,是会抛出拒绝访问的异常。