聊聊在Servlet中怎么上传文件
作者:你这家伙 时间:2022-03-07 17:56:44
首先对Servlet上传文件的简单理解
此前,Servlet本身没有对文件上传提供直接的支持,一般需要使用第三方框架来实现,这样就比较麻烦
不过,Servlet3.0之后提供了这个功能,而且使用非常简单,,为此,HTTPServletRequest提供了两个方法用于从请求中解析出上传的文件:
Part getPart(String name) //获取请求中给定 name 的文件
Collection<Part> getParts() //获取所有的文件
其中每一个文件用一个javax.servlet.http.Part对象来表示,该接口提供了处理文件的简易方法,如write(),delete(),那么,结合 HttpServletRequest 和 Part 来保存上传的文件变得非常简单
Part img = request.getPart("img");
img.write("根路径+\\img.jpg")
注意:可以配合 @MultipartConfig 注解来对上传操作进行一些自定义的配置,比如限制上传文件的大小,以及保存文件的路径等,但是,如果请求的 MIME 类型不是 multipart/form-data,则不能使用上面的两个方法,否则将抛异常。
首先我们掌握开发Servlet的步骤:
前端:如果有前端内容的话,需要再写一个html文件
后端
首先编写后台的Servlet代码(也即重写doGet和doPost方法)
配置项目文件,web.xml里面的映射文件
1.首先写一个页面(前端) html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="img"><p>
<input type="submit" value=" 提 交 ">
</form>
</body>
</html>
代码分析
2.写Servlet后端类代码
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.PrintWriter;
//首先必须声明这个类是用来处理(文件)流的【不可获取】
@MultipartConfig
public class FileServlet extends HttpServlet {
@Override
//因为提交表单只需要post,那么这里就不需要get方法了
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//首先拿到流信息,他返回的是一个part对象
Part part = req.getPart("img");
//手下声明一个保存路径,这里保存在D盘的File文件下
String filePath = "D:\\File\\";
//保存文件的名称这里就和原文件的名称一样,通过part里面的方法得到原文件名称
String fileName = part.getSubmittedFileName();
//通过write方法,可以将这个png文件保存在任意路径下,write里面的参数,就是要保存的路径
part.write(filePath+fileName);
//然后给前端返回响应的结果
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<h1>上传成功</h1>");
}}
3.配置web.xml映射
<servlet>
<servlet-name>fileServlet</servlet-name>
<servlet-class>FileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
4.效果展示
存在问题
那么哪里存在问题呢?
//首先拿到流信息,他返回的是一个part对象
Part part = req.getPart("img");
//手下声明一个保存路径,这里保存在D盘的File文件下
String filePath = "D:\\File\\";
//保存文件的名称这里就和原文件的名称一样,通过part里面的方法得到原文件名称
String fileName = part.getSubmittedFileName();
//通过write方法,可以将这个png文件保存在任意路径下,write里面的参数,就是要保存的路径
part.write(filePath+fileName);
注意:其实这里是存在一点问题的
那么如何进行改进呢?
方法:使用UUID作为文件名
代码改进:也就是把代码中的fileName改成如下
//首先需要一个文件名,改进文件名的名称(防止重复名称覆盖之前的文件)
String fileName = UUID.randomUUID().toString()+
part.getSubmittedFileName().substring(part.getSubmittedFileName().indexOf("."));
结果验证:
来源:https://blog.csdn.net/wkh18891843165/article/details/116761693
标签:Java,Servlet,上传文件
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
在Android中如何使用DataBinding详解(Kotlin)
2022-12-17 15:09:51
Android选择图片或拍照图片上传到服务器
2022-12-15 01:48:41
C#中获取、生成随机数的三种方法
2022-02-24 07:48:12
生成8位随机不重复的数字编号的方法
2023-11-26 07:00:29
Spark SQL的自定义函数UDF使用
2022-07-31 04:19:47
java 中使用匿名类直接new接口详解及实例代码
2021-08-13 22:26:12
SpringBoot+WebSocket实现多人在线聊天案例实例
2022-08-22 11:53:08
![](https://img.aspxhome.com/file/2023/0/78870_0s.png)
C# Memcached缓存用法实例详解
2023-06-29 07:27:33
android6.0权限动态申请框架permissiondispatcher的方法
2023-07-31 10:51:57
深入浅析hbase的优点
2021-08-06 19:27:58
![](https://img.aspxhome.com/file/2023/0/80270_0s.png)
java中带参数的try(){}语法含义详解
2021-10-27 05:20:16
![](https://img.aspxhome.com/file/2023/1/76211_0s.jpg)
Object类toString()和equals()方法使用解析
2022-10-28 08:48:43
Java字符串查找的三种方式
2023-11-18 22:00:30
Mybatis-plus配置分页插件返回统一结果集
2022-05-27 19:15:06
![](https://img.aspxhome.com/file/2023/1/88061_0s.jpg)
C# dump系统lsass内存和sam注册表详细
2021-06-26 12:19:53
![](https://img.aspxhome.com/file/2023/9/70429_0s.jpg)
springboot整合nacos,如何读取nacos配置文件
2022-12-30 19:55:25
![](https://img.aspxhome.com/file/2023/0/80260_0s.png)
Springboot整合pagehelper分页功能
2021-12-14 15:53:48
![](https://img.aspxhome.com/file/2023/0/65270_0s.png)
Android实现屏幕旋转方法总结
2023-04-01 19:37:31
Java编程使用卡片布局管理器示例【基于swing组件】
2022-03-03 10:46:33
![](https://img.aspxhome.com/file/2023/3/76193_0s.jpg)
使用C#获取远程图片 Form用户名与密码Authorization认证的实现
2022-01-22 21:44:06