JavaWeb—上传文件
前期准备
-
我们一般通过流来获取上传的文件(request.getInputstream),但是原始的文件上传流的获取很麻烦,所以我在这里用Apache的文件上传组件来实现文件的上传
-
我们需要准备两个jar包(下载最新的):
- https://mvnrepository.com/artifact/commons-io/commons-io
- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
-
在项目中导入jar包:(导完包记得修复路径)
修复路径:
代码实现
-
注意
- 上传的文件应该放在WEB-INF目录下,用户 无法直接访问这个目录,可以保证服务器的安全
- 为了防止同名覆盖情况出现,需要给上传的文件一个唯一的文件名
- 需要限制上传文件的大小和类型
- 注意乱码问题
- 设置临时文件存储目录
-
前端提交页面
- form表单的method属性值应为post,因为get不能传送大数据的文件,而post没有上线,而且post相对更安全一些
- form表单的enctype属性规定如何对表单数据进行编码,有三个值
1.application/x-www-form-urlencoded—默认值
2.multipart/form-data—当我们上传非文本的内容,比如图片、mp3和文件,用这个属性值
3.text/plain—纯文本传输时,用这个值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
body{
background-color: antiquewhite;
}
p{
color: darksalmon;
font-size:30px;
}
</style>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
<p>用户名:<input type="text" name="username"></p>
<p>上传文件:<input type="file" name="file"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
-
UploadServlet
- ServletFileUpload类—用来处理上传的文件数据,将表单中的每个输入封装成一个FileItem对象
- public void setSizeMax()—用来设置可以传送的文件的最大值
- public void setFileSizeMax()—用来设置上传的单个文件的最大值
- 创建ServletFileUpload对象时需要DiskFileItemFactory(创建FileItem 对象的工厂)对象
- FileItem类
- boolean isFormField()—判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段
- String getName()—用于获得文件上传字段中的文件名
- InputStream getInputStream()—以流的形式返回上传文件的数据内容
- void delete()—主要用于删除临时文件
- ServletContext(servlet上下文)
运行在JAVA虚拟机中的每一个Web应用程序都有一个与之相关的Servlet上下文(一对一)。可以通过getServletContext方法获得ServletContext对象。一个WEB应用程序中的所有Servlet共享同一个ServletContext对象,ServletContext提供对应用程序中所有Servlet所共有的各种资源和功能的访问。
package priv.sehun.servlet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.UUID; public class UploadServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
- ServletFileUpload类—用来处理上传的文件数据,将表单中的每个输入封装成一个FileItem对象