JavaWeb文件上传与下载

一.文件上传

1. 引入两个jar包

jar包可以在maven库进行下载,地址:https://mvnrepository.com,一般点击下载量最多的jar进行下载就可以了。

  • apache:commons-fileupload.jar
  • commons-fileupload.jar这个jar包是依赖commons-io.jar的

2. 代码

前端代码:表单请求方式必须为post,属性为 enctype="multipart/form-data"才能上传文件。

<form action="后端上传接受地址" method="post" enctype="multipart/form-data"><input type="file" name="picture"/>
</form>

后端代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置请求编码request.setCharacterEncoding("utf-8");//设置响应编码response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");//上传try {//判断form表单是否是mutipart格式boolean isMultipart=ServletFileUpload.isMultipartContent(request);if(isMultipart) {//判断前台的form是否有mutipart属性FileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);//通过parseRequest解析form中的所有请求字段,并保存到items集合中,(即前台传递的sname,sno,spiture就保存到items里面了)List<FileItem> items = upload.parseRequest(request);//遍历items中的数据(sno,sname,spicture)Iterator<FileItem> iter=items.iterator();while(iter.hasNext()) {FileItem item = iter.next();//getFieldName获取普通表单字段String itemName = item.getFieldName();int sno = -1;String sname = null;//判断前台字段是普通form表单字段(sname,sno),还是文件字段if(item.isFormField()) {if(itemName.equals("sno")) {sno = Integer.parseInt(item.getString("UTF-8"));}else if(itemName.equals("sname")) {sname = item.getString("UTF-8");}else {System.out.println("其他普通表单字段……");}}else {//文件字段//getName()是获取文件名, //a.txt a.docx a.pngString fileName = item.getName();//防止文件重名覆盖,添加一个文件前缀String prefix = UUID.randomUUID().toString().replaceAll("-", "").replaceAll(".", "");fileName = prefix + fileName;//获取文件内容并上传//定义文件路径:指定上传的文件位置(服务器路径)//动态获取服务器路径String path = request.getSession().getServletContext().getRealPath("static/upload");File file = new File(path,fileName);item.write(file); //将文件上传到指定位置System.out.println(fileName+"上传成功!");return;}}}}catch(FileUploadException e) {e.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}
}

注意问题:
String path = request.getSession().getServletContext().getRealPath("static/upload");通过这种方式指定文件的上传路径,文件只会上传到war包中,容易误删,但指定本机地址,如D:\bookimg,img访问不了。所以就还是第一种方式将文件存放到war包中,即服务器上就好了。项目重新运行会重新编译一次,按道理war包中之前上传的资源是会被清除的,但我测试后发现文件还是存在,但这是好事,这就不用担心文件被清空了。重启是我们手动的行为,如果是重要的文件怕被清空,可以先保存下来到项目中相同的文件路径下再启动即可。如path指定的路径为static/upload,在重启先可以将war包下的static/upload文件复制一份到源码中,即使重新编译也会携带上这些文件。这就比较稳妥了。

二、文件下载

不需要依赖任何jar

  1. 直接通过<img/>标签就可以请求到服务器中的图片资源了。
  2. 如果是文件则通过输出流的形式将文件输出给用户
    注意: 文件需要设置响应头,如果是任意类型则通过附件形式指定文件类型,两个响应头都要设置。如果content-Type指定了具体的响应类型,并且直接在浏览器中显示,则不需要设置content-Disposition
 //MIME类型,表示二进制文件,任意类型都可以
response.addHeader("content-Type","application/octet-stream"); 
//attachement表示以附件的方式下载文件
response.addHeader("content-Disposition","attachement;filename="+fileName);
文件类型Content-Type
二进制文件(任何类型的文件)application/octet-stream
Wordapplication/msword
Excelapplication/vnd.ms-excel
PPTapplication/vnd.ms-powerpoint
图片image/gif, image/bmp, image/jpeg
文本文件text/plain
html网页text/html

代码

public class DownLoadServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {//获取需要下载的文件名String fileName = request.getParameter("filename"); //from表单和a标签参数的获取都用getParameter//下载文件:需要设置消息头response.addHeader("content-Type","application/octet-stream");//MIME类型,这里为二进制文件(任意文件类型都可)response.addHeader("content-Disposition","attachement;filename="+fileName); //attachement为附件,以附件方式获取要下载的文件,filename指定具体文件,包含了文件后缀:abc.txt//Servlet通过文件的地址,将文件转为输入流,读到Servlet中InputStream in = getServletContext().getResourceAsStream("upload/"+fileName);//通过输出流将刚才已经转为输入流的文件输出给用户ServletOutputStream out = response.getOutputStream();byte[] bs = new byte[10];int len = -1;while((len=in.read(bs))!= -1){out.write(bs,0,len);}out.close();}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桌面概率长按键盘无法连续输入问题

问题描述&#xff1a;概率性长按键盘无法连续输入文本 问题定位&#xff1a; 系统按键流程分析 图一 系统按键流程 按键是由X Server接收的&#xff0c;这一点只要明白了X Window的工作机制就不难理解了。X Server在接收到按键后&#xff0c;会转发到相应程序的窗口中。在窗…

重启docker容器后,ssh无法访问且浏览器无法访问

今天把云服务器中的docker容器重启一遍后&#xff0c;发现里面的项目访问不到了&#xff0c;而且也无法ssh访问。 改了一天&#xff0c;终于还是改好了。 一 .首先是无法ssh访问&#xff0c; 我无法ssh连接的原因是因为我容器的重启之后sshd没有了&#xff0c;然后重新下载了…

助力智能人群检测计数,基于YOLOv5全系列模型【n/s/m/l/x】开发构建通用场景下人群检测计数识别系统

在一些人流量比较大的场合&#xff0c;或者是一些特殊时刻、时段、节假日等特殊时期下&#xff0c;密切关注当前系统所承载的人流量是十分必要的&#xff0c;对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段&#xff0c;本文的主要目的是想要…

SpringIOC之作用域Scope

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

设计模式之创建型设计模式(一):单例模式 原型模式

单例模式 Singleton 1、什么是单例模式 在软件设计中&#xff0c;单例模式是一种创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 这意味着无论何时需要该类的实例&#xff0c;都可以获得相同的实例&#xff0c;而不会创建…

使用VBA快速统计词组词频(多单词组合)(2/2)

实例需求&#xff1a;产品清单如A列所示&#xff0c;现在如下统计多单词组合词组词频。 在上一篇博客中《使用VBA快速统计词组词频(多单词组合)&#xff08;1/2&#xff09;》讲解了如何实现双词的词频统计。 本文将讲解如何实现3词的词频统计&#xff0c;掌握实现方法之后&a…

前端Vue必问面试题

1,Vue3.0 为什么要使用 proxy 在 Vue2 中, 0bject.defineProperty 会改变原始数据,而 Proxy 是创建对象的虚拟表示,并提供 set 、get 和 deleteProperty 等处理器,这些处理器可在访问或修改原始对象上的属性时进行拦截,有以下特点∶ 不需用使用 Vue. s e t 或 V u e . s…

硬件编程语言

硬件画板说白了就是电气的连接&#xff0c;相较于PCB连接在2.5D中完成&#xff08;有些大佬们是直接3D设计&#xff09;考虑的东西会更多&#xff0c;原理图的抽象使得硬件思路更加简单。 就算是这样&#xff0c; 增加到上千门器件后的大工程是非常难以进行的编辑和检查的&…

Mac如何安装stable diffusion

今天跟大家一起在Mac电脑上安装下stable diffusion&#xff0c;在midjourney等模型收费的情况下如何用自己的电脑算力用上免费的画图大模型呢&#xff1f;来吧一起实操起来 一、安装homebrew 官网地址&#xff1a;Homebrew — The Missing Package Manager for macOS (or Lin…

认识Trino

认识Trino 一、Trino二、结构三、集群四、coordinator五、Worker六、数据源七、连接器八、目录九、架构十、表十一、查询执行模型十二、陈述十三、查询十四、阶段十五、任务十六、分隔十七、Driver十八、Operator十九、Exchange 一、Trino Trino&#xff08;前身为PrestoSQL&a…

conda和pip配置国内镜像源

1、conda配置镜像源&#xff1a; 使用conda进行安装时&#xff0c;访问的是国外的网络&#xff0c;所以下载和安装包时会特别慢。我们需要更换到国内镜像源地址&#xff0c;这里我更换到国内的清华大学地址。&#xff08;永久添加镜像&#xff09; Windows和Linux 对于conda修…

SQL进阶理论篇(十):数据库中的锁

文章目录 简介按照锁的粒度进行划分从数据库管理的角度进行划分从程序员的角度进行划分为什么共享锁会发生死锁&#xff1f;参考文献 简介 索引和锁&#xff0c;是数据库中的两个核心知识点。 索引的相关知识点&#xff0c;在之前的几章里我们已经介绍的差不多了。接下来我们…

[pasecactf_2019]flask_ssti proc ssti config

其实这个很简单 Linux的/proc/self/学习-CSDN博客 首先ssti 直接fenjing一把锁了 这里被加密后 存储在 config中了 然后我们去config中查看即可 {{config}} 可以获取到flag的值 -M7\x10wd94\x02!-\x0eL\x0c;\x07(DKO\r\x17!2R4\x02\rO\x0bsT#-\x1cZ\x1dG然后就可以写代码解…

MNIST内置手写数字数据集的实现

torchvision库 torchivision库是PyTorch中用来处理图像和视频的一个辅助库&#xff0c;接下来我们就会使用torchvision库加载内置的数据集进行分类模型的演示 为了统一数据加载和处理代码&#xff0c;PyTorch提供了两个类用于处理数据加载&#xff0c;他们分别是torch.utils.…

leetcode:641. 设计循环双端队列

设计循环双端队列 实现 MyCircularDeque 类: MyCircularDeque(int k) &#xff1a;构造函数,双端队列最大为 k 。 boolean insertFront()&#xff1a;将一个元素添加到双端队列头部。 如果操作成功返回 true &#xff0c;否则返回 false 。 boolean insertLast() &#xff1a;…

机器视觉技术与应用实战(开运算、闭运算、细化)

开运算和闭运算的基础是膨胀和腐蚀&#xff0c;可以在看本文章前先阅读这篇文章机器视觉技术与应用实战&#xff08;Chapter Two-04&#xff09;-CSDN博客 开运算&#xff1a;先腐蚀后膨胀。开运算可以使图像的轮廓变得光滑&#xff0c;具有断开狭窄的间断和消除细小突出物的作…

饥荒Mod 开发(十五):小地图显示物品

饥荒Mod 开发(十四)&#xff1a;制作屏幕弹窗 本篇源码 饥荒中按下Tab键可以显示地图&#xff0c;刚开始进入游戏的时候地图是未探索状态&#xff0c;所以我们并不知道地图上面的物品分布情况。并且地图上只会显示很少一部分的物品&#xff0c;比如树枝&#xff0c;草&#xf…

C++二维数组(4)

蛇形遍历 题目描述&#xff1a;用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。 蛇形填充方法为&#xff1a; 对于每一条左下-右上的斜线&#xff0c;从左上到右下依次编号1,2,...,2n-1&#xff1b;按编号从小到大的顺序&#xff0c;将数字从小到大填入各 条斜线&…

【Linux】操作文件和目录

简介 常见的一些对文件和目录操作的命令如下&#xff1a; cp&#xff1a;复制文件和目录。mv&#xff1a;移动/重命名文件和目录。mkdir&#xff1a;创建目录。rm&#xff1a;删除文件和目录。ln&#xff1a;创建硬链接和符号链接。 用图形文件管理器来完成一些由这些命令执…

Debezium发布历史11

原文地址&#xff1a; https://debezium.io/blog/2016/10/25/Debezium-0-3-4-Released/ Debezium 0.3.4 发布 2016 年 10 月 25 日 作者&#xff1a; Randall Hauch 发布 mysql docker 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&…