网上还是有很多文件上传的案例,但是当我还不懂怎么上传的时候看起来还是非常吃力的.
今天老师讲解了怎么文件上传.我就把记下来,免得忘记
首先新建工程
我们先写前端index.html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>FileUpload</title>
</head>
<body>
<form action="fileUpdate.do" method="post" enctype="multipart/form-data">
<input type="file" required name="file"><br />
<input type="submit" value="上传">
</form>
</body>
</html>
下面来创建Servlet
添加@WebServlet("/fileUpdate.do")
注解用于将action提交到此Servlet
添加 @MultipartConfig
注解用于解析上传文件(没有这个注解就不能上传)
然后执行服务器,看看后台执行了什么东西
进入主页看到这样的界面
选择一个文件 点击上传按钮
在控制台出现这个东西
点击Name为fileUpload.do的东西
右边就会显示详细信息
定位到最下面看到红线圈出来的地方
这个就是上传的文件信息,所以在编写后端代码的时候就只需要解析这个信息就可以了.
回到Servlet 首先确定上传的文件存放目录(这段代码要写在doPost里面,因为文件上传只能用post,
get能够传送的东西很少,所以才用的post.我是这样认为的)
//存放文件目录
String path = "D:/Projects Files/images";
File file = new File(path);
if (!file.exists())
file.mkdirs();
再执行文件上传操作,就是得到Part对象
// 执行文件上传操作
Part part = request.getPart("file");
然后获取上传文件的文件名
//获取文件名称
String disposition = part.getHeader("Content-Disposition");
String filename = disposition.split("[;]")[2];
filename = filename.substring(filename.indexOf("\"") + 1, filename.length() - 1);
由于不能直接获取文件名,所以就要自己解析文件名了.这个步骤就要用到上面那个用红色圈起来的东西了.我们首先得到http信息头下面的Content-Disposition信息.就是下面用红色圈起来的文字了.这是稳定规定的名字,所以直接调用就好
String disposition = part.getHeader("Content-Disposition");
disposition 字符串得到的就是form-data; name="file"; filename="Snipaste_2017-09-11_15-56-46.png"
这个内容
所以就先将他用分号分隔开得到三个字符串文件名在第三个字符串里面,所以下标为2(数组技术从0开始)值为filename="Snipaste_2017-09-11_15-56-46.png"
(filename前面是还有一个空格,但是在这里并不重要,只是提一下)
然后提取文件名字符串就是定位第一个引号后一位到结尾前一个位就好.最后的到的filename才是完整的文件名.
最后当然是将上传的文件写到磁盘
part.write(path + File.separator + filename);
完整代码
package com.wanli;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/fileUpdate.do")
@MultipartConfig
public class FileUploadDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 存放文件目录
String path = "D:/Projects Files/images";
File file = new File(path);
if (!file.exists())
file.mkdirs();
// 执行文件上传操作
Part part = request.getPart("file");
// 获取文件名称
String disposition = part.getHeader("Content-Disposition");
String filename = disposition.split("\\;")[2];
filename = filename.substring(filename.indexOf("\"") + 1, filename.length() - 1);
part.write(path + File.separator + filename);
}
}
最后重启下服务器再次尝试上传文件,然后查看D:/Projects Files/images
是否上传成功
当然这是最简单的上传文件操作了,如果要限制文件上传个数,大小就要到@MultipartConfig
注解里面设置了@MultipartConfig(maxFileSize = 1024 * 1024 * 3)
限制文件上传大小为3M
设置上传文件个数为两个@MultipartConfig(maxRequestSize = 2)
,等等操作.
上面上传文件的代码其实还是很少的了.如果读者发现文章中有纰漏的地方希望能够指出来,谢谢!!