文件上传:
客户端把文件上传到服务器,
服务器保存客户上传的文件:
1)把文件保存到数据库中(表对应文件的字段的数据类型: blob), 很少使用,
文件保存到数据库麻烦(通过编写存储过程), 从数据库取文件也麻烦
2)把文件保存到web服务器的硬盘, 数据库中存放的文件的路径 学习
Web服务器的压力大, 用户操作文件(大量的IO操作), 需要访问web服务器,
3)再搭建一个文件服务器,专门用于存放上传的文件, 数据库中存放的文件的url(网络路径), 模式与2一样, 把文件与web服务器分离, 减轻web服务器的压力
Linux操作系统
文件上传的环境:
1)前端页面的设置:
A)使用 文件域标签
B)对form表单的标签的method=”post”请求
C)对form表单的标签的enctype的属性设置:
enctype的默认值: application/x-www-form-urlencoded 对内容进行url编码, 而文件本身就是二进制, 不能进行编码,一旦编码, 变成文本, 不再是文件.
enctype的值设置为: multipart/form-data 对内容不进行编码
2)后台的设置:
A)导入用于文件上传的第三方jar:
B)一旦前端表单设置enctype为”multipart/form-data”
request.getParamter()这一类获取请求参数的方法失效
文件上传的编码实现:
1)创建工厂类DiskFileItemFactory对象
2)创建一个文件上传的解析器对象 ServletFileUpload ,用于解析request请求
3)使用解析器对象解析request, (把request中包含的请求参数获取到)
调用解析器对象的List parseRequest(request)
4)遍历List集合获取到每一个FileItem(对应的就是表单中每一项:input)
5)判断FileItem是否是文件域还是普通表单元素,如果是普通表单项. 获取这个表单项的value值, 如果是文件域, 把文件保存到指定的硬盘位置
//设置请求体编码
request.setCharacterEncoding("UTF-8");
//1 ,先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
if (ServletFileUpload.isMultipartContent(request)) {
// 2 ,创建 FileItemFactory 工厂实现类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
// 3,创建用于解析上传数据的工具类 ServletFileUpload 类
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
//4,设置上传文件大小 默认单位字节
servletFileUpload.setFileSizeMax(3000*1024);
Student student = new Student(); //创建对象来接收数据
try {
// 5,解析上传的数据,得到含有每一个表单项 FileItem 的list集合
List<FileItem> list = servletFileUpload.parseRequest(request);
// 6,循环判断,每一个表单项,是普通类型,还是上传的文件
for (FileItem fileItem : list) {
if (fileItem.isFormField()) {
//6.1 普通表单项
String name = fileItem.getFieldName();
if(name.equals("name")){
student.setName(fileItem.getString("UTf-8"));
}else if(name.equals("password")){
String password = fileItem.getString("UTf-8");<