聊聊在Servlet中怎么上传文件
作者:你这家伙 发布时间:2022-03-07 17:56:44
标签:Java,Servlet,上传文件
首先对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


猜你喜欢
- 想问下这是什么情况。在导入一个maven项目时只有一个finish,点击完finish后没有任何反应。。。各位大佬给看下这是什么问题。急,在
- 本文实例讲述了Android开发实现的IntentUtil跳转多功能工具类。分享给大家供大家参考,具体如下:说明:此工具类是本人开发中总结下
- 问题(1)synchronized的特性?(2)synchronized的实现原理?(3)synchronized是否可重入?(4)sync
- C#与C++ dll之间传递字符串string wchar_t* char* IntPtr1、由C#向C++ dll 传入字符串时,参数直接
- 1、抽象类1.1 什么是抽象类?1.1.1 对抽象类的理解1.1.2 关于抽象类类与类之间具有共同特征,将这些共同特征提取出来,形成的就是抽
- 本文实例讲述了Java排序算法总结之希尔排序。分享给大家供大家参考。具体分析如下:前言:希尔排序(Shell Sort)是插入排序的一种。是
- Maven系列11.什么是Maven?Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生
- 源码:[StructLayout(LayoutKind.Explicit)] public struct IP {&nb
- 本节作为主要讲解Spring Data的环境搭建JPA Spring Data :致力于减少数据访问层(DAO)的开发量。开发者唯一要做的就
- 条形码,是由宽度不等的多个黑条和空白所组成,用以表达一组信息的图形标识符。通过给文档添加条形码,可以直观,快捷地访问和分享一些重要的信息。本
- 1.客户端代码public class UploadPicClient { public static void main(String[]
- 分析代码规范,并从代码角度分析存在的风险,并且支持一键更改。具体操作如下图:简单方便,最主要的是好用!补充:下面看下IntelliJ IDE
- Android Fragment的回退栈点开之后按一次回退键只返回一次MainActivity 类public class Ma
- 目录1、通过session中的token验证步骤1:创建自定义注解步骤2:创建自定义 * (@slf4j是lombok的注解)步骤3:将自定
- 在Value中的Style.xml中,添加: <style name="NoTitle"
- 引言在 java8 中,您可以使用 Arrays.Stream 或 Stream.of 将 Array 转换为 Stream。1. 对象数组
- 主要功能设计:用户、区域、物质类型、物质详情、物质申请和审核以及我的申请和通知公告以及灵活控制菜单权限主要技术实现:spring、 spri
- 本文实例讲述了C#设计模式之Facade外观模式解决天河城购物问题。分享给大家供大家参考,具体如下:一、理论定义外观模式 &nbs
- 开发工具 :idea工程结构:父工程father子模块 dao (用于持久化数据跟数据库交互)子模块 entity (实体类)子模块 ser
- 本文实例讲述了C#异步执行任务的方法。分享给大家供大家参考。具体如下:// 异步执行耗时任务(适合不需要等它的执行结果的场景,如发邮件、发短