本次笔记主要目录如下
1.文件上传三要素
- 提供form表单,method必须是post
- form表单的enctype必须是multipart/form-data
- 提供input type="file"类型输入
- fileupload.jsp大致代码如下
<%--
Created by IntelliJ IDEA.
User: weijisheng
Date: 2022/2/28
Time: 18:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<center>
<form action="/fileUpload.do" method="post" enctype="multipart/form-data">
<tr>
<td>姓名:</td>
<td><input type="text" name="uname" value=""></td>
</tr>
<tr>
<td>上传:</td>
<td><input type="file" name="upFile" value=""></td>
</tr>
<input type="submit" value="提交">
</form>
</body>
</center>
</html>
2.所需jar的两个jar包
commons-fileupload-xxx.jar
commons-io-xxx.jar
3. Servlet的上传解析
package upload;
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;
import java.io.IOException;
@WebServlet("/fileUpload.do")
//当前servlet是处理文件上传的,数据类型是multipart
//当前servlet需要开启 multipart数据类型的配置,才能接受multipart中的数据
//在当前servlet中开始multipart的配置
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
// 1.接受参数
String name = request.getParameter("uname");
// 2.文件类型的数据 这就是文件
Part part = request.getPart("upFile");
// 3.part得到的就是文件
// 得到文件的名字
String keyName = part.getName();//key的名字 upFile
//getSubmittedFileName
String fileName = part.getSubmittedFileName();//表单提交时 文件的名字
System.out.println("key" + keyName);
System.out.println("文件的名字" + fileName);
// 3.服务器接收到了文件,把文件保存在指定位置
String path="D:/Study/img";
String uploadFile=path+"/"+fileName;
//4.part中上传的方法
part.write(uploadFile);
resp.sendRedirect("FileSuccess.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注意点:servlet-api的版本,旧版缺少方法
@MultipartConfig注解一定要注意
3.1 多文件上传的处理
思路:多文件上传的时候需要接收的是getParts,返回一个集合,再依次遍历。
4.服务器的路径
4.1获取上传文件的文件名
String filename = part.getSubmittedFileName();
4.2要作为存储到图片文件夹
String path=request.getServletContext().getRealPath("要上传的文件夹");
4.3文件上传的详细地址
String uploadPath=path+"/"+fileName
4.4 将文件写入到路径中,此处用封装
part.write(uploadPath);
5.虚拟路径
虚拟路径可以用作图片回显功能
在jsp中得到文件名字的话,可以通过
session.setAttribute("imgName",filename);
resp.sendRedirect("FileSuccess.jsp");
把文件名字通过session域对象发放到某个jsp界面,在某个jsp界面通过拼接的方式得到文件,相当于直接访问虚拟路径地址。
<img src="${pageContext.request.contextPath}/img/${imgName}" />
**以上方式都是在servlet里面实验的。**
6.SpringMVC方式进行文件上传
6.1准备工作
准备pom文件,需要common-io和commons-fileupload
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
在spring_servlet.xml里面进行视图解析器的配置
<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置文件上传的最大尺寸为5MB-->
<property name="maxUploadSize" value="5242880"></property>
</bean>
注意:文件上传解析器是有id的,如果报错的话,注意id的配置
6.2 文件编写
form表单参考上面所示,都一样的。
mvc里面的java文件如下
MultipartFile goodPhoto,HttpServletRequest request
//接收的文件名字
//获取文件名字
String filename = goodPhoto.getOriginalFilename();
System.out.println("文件名" + filename);
//将图片存储起来
//获取上传路径
String realPath = request.getServletContext().getRealPath("fileupload");
System.out.println("realpath"+realPath);
//拼接新路径
String upload=realPath+"\\"+filename;
System.out.println("文件最终上传路径"+upload);
//上传文件
goodPhoto.transferTo(new File(upload));
//向后端传输值
System.out.println("上传成功");
注意点:所需要的头文件的request来自HttpServletRequest
虚拟路径配置参考上面
6.3虚拟路径的存图方式
虚拟路径取值比较方便,但是存值的话不太方便,这时候我们需要手动去获取当前项目创建的文件夹路径,并将值存储进去。
ps:这种方式路径一般放在配置文件中,这里只是演示。
部分代码如下所示:
String filename=fileUpload.getOriginalFilename();
String filepath="D:\\Program Files\\idea project\\homeWork_ssm1\\src\\main\\webapp\\fileupload"+"\\"+filename;
System.out.println("文件上传路径"+filepath);
7.获取项目运行时候的真实路径
7.1 web应用使用ServletContext
//通过HTTPServlet获取ServletContext
ServletContext servletContext = this.getServletContext();
//获取文件的服务器真实路径
//web目录下
String realPath = servletContext.getRealPath("/b.txt");
System.out.println(realPath);
7.2springboot项目常用的两种获取classes真实路径的方法
7.2.1使用ClassUtils
String path = ClassUtils.getDefaultClassLoader()
.getResource("")
.getPath();
System.out.println(path);
7.2.2使用ResourceUtils
try {
String path2 = ResourceUtils.getURL("classpath:").getPath();
System.out.println(path2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}