Javaweb文件上传至服务器/从服务器下载
Javaweb文件上传至服务器/从服务器下载
思路图


文件上传思路:
也可以直接看代码
判断是不是文件表单(判断form的enctype是不是="multipart/form-data"),因为只有文件表单才能上传文件
创建 DiskFileItemFactory 对象, 用于构建一个解析上传数据的工具对象
创建一个解析上传数据的工具对象servletFileUpload
关键的地方, servletFileUpload 对象可以把表单提交的数据 text / 文件,将其封装到为 FileItem 类型的List中,然后就可以遍历,并分别处理表单中的每一个提交的数据
判断数据是一个text还是文件然后分别进行处理
如果是一个文件,就把这个上传到 服务器的 temp 下的文件保存到你指定的目录
指定一个在我们网站工作目录下的目录,(相对于当前 Web 应用程序的虚拟路径)
获取到指定的虚拟目录的物理实际路径,因为我们上传文件不可能是在一个虚拟的地方
创建这个指定的目录
将文件拷贝到该目录
以下是完整代码:放在servlet的dopost/get函数里,为了美观已省略try-catch,为了保证代码美观最好请用电脑全屏观看
//1. 判断是不是文件表单(判断form的enctype是不是="multipart/form-data"),因为只有文件表单才能上传文件
if (ServletFileUpload.isMultipartContent(request)) {
//2. 创建 DiskFileItemFactory 对象, 用于构建一个解析上传数据的工具对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//3. 创建一个解析上传数据的工具对象
ServletFileUpload servletFileUpload =
new ServletFileUpload(diskFileItemFactory);
//解决接收到文件名是中文乱码问题
servletFileUpload.setHeaderEncoding("utf-8");
//4. 关键的地方, servletFileUpload 对象可以把表单提交的数据text / 文件,将其封装到 FileItem 文件项中
List<FileItem> list = servletFileUpload.parseRequest(request);
//遍历,并分别处理
for (FileItem fileItem : list) {
//判断是不是一个文件
if (fileItem.isFormField()) { //如果是true就是文本 input text
String name = fileItem.getString("utf-8"); //想要获取input text要通过getString方法获取到
System.out.println("家具名=" + name);
} else { //是一个文件
//获取上传的文件的名字
String name = fileItem.getName();
System.out.println("上传的文件名=" + name);
//把这个上传到 服务器的 temp下 的文件保存到你指定的目录
//1.指定一个目录 , 但是这个目录是相对于这个web应用的路径,相当于以xxx_war_exploded这个目录为参照
//写一个相对路径表示你要创建的目录
String filePath = "/upload/"; //最后一个斜杠表示这个路径指向一个目录,而不是一个文件
//2. 获取到指定的虚拟目录的物理路径,request.getServletContext()获取到一个ServletContext,然后它可以调用 getRealPath(filePath),将filePath转换为物理的实际路径
//因为我们知道我们的web应用其实一直是一个放在设定好的application context目录下的一个虚拟路径里。
//所以我们要调用getRealPath()将其转换成一个物理上的真实路径,这样才能真实的保存一个文件。
//一句话概括这个过程发生了什么呢,其实就是以xxx_war_exploded这个web应用目录为基础,在上一级目录下建一个文件夹叫upload
String fileRealPath = request.getServletContext().getRealPath(filePath);
// fileRealPath=E:fileupdown\out\artifacts\fileupdown_war_exploded\xupload\
//3. 创建fileRealPath这个已指定好的用于上传的实际目录
File fileRealPathDirectory = new File(fileRealPath);
// fileRealPathDirectory=E:fileupdown\out\artifacts\fileupdown_war_exploded\xupload\2023\4\12
if (!fileRealPathDirectory.exists()) { //不存在,就创建
fileRealPathDirectory.mkdirs(); //创建
}
//4. 将文件拷贝到fileRealPathDirectory目录
// 构建一个上传文件的完整路径 :目录+文件名
// 对上传的文件名进行处理, 前面增加一个前缀,保证是唯一即可
name = UUID.randomUUID().toString() + "_" +System.currentTimeMillis() + "_" + name;
String fileFullPath = fileRealPathDirectory + "/" +name;
//fileFullPath=E:\JavaProject\hspedu_javaweb\fileupdown\out\artifacts\fileupdown_war_exploded\upload\yyyy\mm\dd/name
fileItem.write(new File(fileFullPath));
//5. 提示信息
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("上传成功~");
}
}
} else {
System.out.println("不是文件表单...");
}
文件下载思路:
先准备要下载的文件[假定这些文件是公共的资源],
重要: 保证当我们的tomcat启动后,在工作目录out下有download文件夹, 并且有可供下载的文件!!
获取到要下载的文件的名字
给http响应设置响应头文件格式 Content-Type,就是文件的MIME
给http响应设置响应头 Content-Disposition来指定下载的数据的展示形式,attachment 则使用文件下载方式,复制以下代码即可
//(1)如果是Firefox 则中文编码需要 base64
//(2)Content-Disposition 是指定下载的数据的展示形式 , 如果attachment 则使用文件下载方式
//(3)如果是其他(主流ie/chrome) 中文编码使用URL编码
if (request.getHeader("User-Agent").contains("Firefox")) {
// 火狐 Base64编码
response.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" +
new BASE64Encoder().encode(downLoadFileName.getBytes("UTF-8")) + "?=");
} else {
// 其他(主流ie/chrome)使用URL编码操作
response.setHeader("Content-Disposition", "attachment; filename=" +
URLEncoder.encode(downLoadFileName, "UTF-8"));
}读取下载的文件数据,返回给客户端/浏览器
接下来走一下代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 先准备要下载的文件[假定这些文件是公共的资源]
// 重要: 保证当我们的tomcat启动后,在工作目录out下有download文件夹, 并且有可供下载的文件!!
// 如果你没有看到你创建的download在工作目录out下 rebuild project -> restart, 就OK
//2. 获取到要下载的文件的名字
request.setCharacterEncoding("utf-8");
String downLoadFileName = request.getParameter("name");
//System.out.println("downLoadFileName= " + downLoadFileName);
//3. 给http响应,设置响应头文件格式 Content-Type , 就是文件的MIME
// 通过servletContext 来获取
ServletContext servletContext = request.getServletContext();
String downLoadPath = "/download/"; //下载目录从 web工程根目录计算
String downLoadFileFullPath = downLoadPath + downLoadFileName; // /download/1.jpg
String mimeType = servletContext.getMimeType(downLoadFileFullPath);
System.out.println("mimeType= " + mimeType);
response.setContentType(mimeType);
//4. 给http响应,设置响应头 Content-Disposition
//(1)如果是Firefox 则中文编码需要 base64
//(2)Content-Disposition 是指定下载的数据的展示形式 , 如果attachment 则使用文件下载方式
//(3)如果是其他(主流ie/chrome) 中文编码使用URL编码
if (request.getHeader("User-Agent").contains("Firefox")) {
// 火狐 Base64编码
response.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" +
new BASE64Encoder().encode(downLoadFileName.getBytes("UTF-8")) + "?=");
} else {
// 其他(主流ie/chrome)使用URL编码操作
response.setHeader("Content-Disposition", "attachment; filename=" +
URLEncoder.encode(downLoadFileName, "UTF-8"));
}
//5. 读取下载的文件数据,返回给客户端/浏览器
//(1) 创建一个和要下载的文件,关联的输入流
InputStream resourceAsStream = servletContext.getResourceAsStream(downLoadFileFullPath);
//(2) 得到返回数据的输出流 [因为返回文件大多数是二进制(字节), IO java基础]
ServletOutputStream outputStream = response.getOutputStream();
//(3) 使用工具类,将输入流关联的文件,对拷到输出流,并返回给客户端/浏览器
IOUtils.copy(resourceAsStream, outputStream);
}
Javaweb文件上传至服务器/从服务器下载的更多相关文章
- 将本地文件上传到指定的服务器(HttpWebRequest方法)
将本地文件上传到指定的服务器(HttpWebRequest方法),通过文件流,带文件名,同文件一同上传的表单文本域及值. ///<summary> /// 将本地文件上传到指定的服务器(H ...
- JavaScript进阶(九)JS实现本地文件上传至阿里云服务器
JS实现本地文件上传至阿里云服务器 前言 在前面的博客< JavaScript进阶(八)JS实现图片预览并导入服务器功能>(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务 ...
- .JavaWeb文件上传和FileUpload组件使用
.JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...
- Mac将本地文件上传到Centos7(Linux)服务器上
1.打开终端,输入命令: scp /Users/codez/Downloads/jdk-8u144-linux-x64.tar.gz root@139.224.235.xxx:/root/java/j ...
- springmvc 文件上传实现(不是服务器的)
1.spring使用了apache-commons下的上传组件,因此,我们需要引用2个jar包 1)apache-commons-fileupload.jar 2 ) apache-commons-i ...
- JavaWeb——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- JavaWeb 文件 上传 下载
文件上传下载对于一个网站来说,重要性不言而喻.今天来分享一个JavaWeb方式实现的文件上传下载的小例子. 项目依赖 项目目录 工作流程 文件上传 表单处的设置 服务器端 上传功能的实现 upload ...
- JavaWeb 文件上传下载
1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...
- JavaWeb -- 文件上传下载示例
1. 上传简单示例 Jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...
- 转载:JavaWeb 文件上传下载
转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...
随机推荐
- xcodebuild命令行工具使用详解
xcodebuild命令行工具使用 如何通过命令行编译ios项目? xcodebuild是一个命令行工具,允许你从命令行对Xcode项目和工作区执行编译.查询.分析.测试和归档操作.它对项目中包含的一 ...
- Django笔记十八之save函数的继承操作和指定字段更新等实例方法
本文首发于微信公众号:Hunter后端 原文链接:Django笔记十八之save函数的继承操作和指定字段更新等实例方法 这篇笔记主要介绍 Django 一些实例方法. 什么是 实例,我们知道通过fil ...
- MINIO搭建单机以及集群
MINIO简介 Minio是Apache License v2.0下发布的对象存储服务器.它与Amazon S3云存储服务兼容.它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/VM映像. ...
- 在idea中将一个javase项目转成ee项目
在idea中将java项目转成web项目 1.创建一个java项目,new一个directory名为web(与src同级) 2. 为web指定根目录:ctrl+shift+alt+s,在module中 ...
- Scanner对象的用法
Java流程控制 想要实现程序与人的交互,我们必须使用Java给我们提供的工具类.就像我最开始写的一篇博客,用Java提供给我们的一个机器人类Robot是控制鼠标键盘的.今天我们学习的是一个可以获取用 ...
- DRF的限流组件(源码分析)
DRF限流组件(源码分析) 限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷. 对于匿名用户,使用用户IP作为唯一标识. 对于登录用户,使用 ...
- 带大小写忽略的Replace
#region 以下函数用于忽略大小写替换操作 public static string Replace(string Expression, string Find, string Replacem ...
- 文心一言 VS chatgpt (10)-- 算法导论 3.1 2~3题
二.证明:对任意实常量a和b,其中b>0,有(n+a) ^ b=O(n ^ b). 文心一言: 设a=b,则有(n+a) ^ b=(n+b)(n+a)=n ^ b+n ^ b =O(n ^ b) ...
- pgadmin数据输出不存在了?
菜单栏→文件→重置布局.这样数据输出就显示了.
- 2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。
2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的. 返回最短距离,精确到小数点后面4位. 答案2022-11- ...