当前位置: 首页 > news >正文

基于Java与JSP的文件上传和下载

概念

当用户在前端页面点击文件上传后,用户上传的文件数据提交给服务器端,实现保存。

文件上传步骤

提交方式:

提供form表单,method必须是post。因为post请求无数据限制。

<form method="post"></form>

提交数据格式:

表单的enctype属性值必须为multipart/form-data.

以多段的形式进行拼接提交。以二进制的方式来处理表单数据,会把指定的文件内容封装进请求参数中。

<form enctype="multipart/form-data" method="post"></form>

提供组件:

提供file表单组件,提供给用户上传文件。

解决文件上传命名重复问题:

当上传重复的文件时,为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。

public class UploadUtls{

        //使用UUID生成唯一标识码,并拼接上图片的名称

        public static String NewFileName(String fileName){

                return UUID.randomUUID().toString.replaceAll("-","")+"_"+fileName;

        }

}

upload.jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>文件上传页面</title>
</head>
<body><form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">用户名: <input type="text" name="username"> <br>选择文件: <input type="file" name="file"> <br><input type="submit" value="上传"></form>
</body>
</html>

UploadController.java代码(注意:上传成功后创建的文件夹与文件在真实的文件目录下,即out目录下)

import com.tyh.utils.UploadUtils;import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;//实现文件上传
@WebServlet(name = "UploadController",value = "/upload")
//文件注解,maxFileSize单个文件上传空间大小,maxRequestSize多个文件总共上传空间大小
@MultipartConfig(maxFileSize = 1024*1024*100,maxRequestSize = 1024*1024*200)
public class UploadController extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置编码req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");//获取请求的数据String username = req.getParameter("username");//获取文件上传的数据Part part = req.getPart("file");//获取上传文件的路径 真实路径String uploadPath = req.getServletContext().getRealPath("/WEB-INF/upload");File file = new File(uploadPath);if (!file.exists()){//不存在则新建文件夹file.mkdirs();}//文件上传//生成唯一文件名String oldName = part.getSubmittedFileName();String newName = UploadUtils.newFileName(oldName);part.write(uploadPath+"\\"+newName);//响应客户端 上传成功resp.getWriter().println(part.getSubmittedFileName()+"上传成功!");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}
}

 文件类型限制:

要限制上传文件地类型,在收到上传文件名时,判断后缀名是否合法。

//创建一个集合存放允许上传的文件地类型(后缀名)

//判断所上传的文件在当前集合中是否包含

LIst<String> nameList = new ArrayList<String>();

nameList.add(".jpg");

nameList.add(".png");

nameLiat.add(".jpeg");

String newName = fileName.substring(fileName.lastIndex("."));

if(!nameList.contains(newName)){

        response.getWriter().println(fileName+"不符合文件上传规则!");

        return;

}

多文件上传: 

1.利用request.getParts()获取文件集并存储到Collection集合中,

2.利用增强for循环遍历集合中的每个文件对象

3.然后同以上单个上传文件原理一样,依次逐个上传文件

JSP页面代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>文件上传页面</title>
</head>
<body><form action="${pageContext.request.contextPath}/moreUpload" enctype="multipart/form-data" method="post">选择文件: <input type="file" name="file"> <br>继续选择文件: <input type="file" name="file2"> <br><input type="submit" value="上传"></form>
</body>
</html>

Servlet代码

import com.tyh.utils.UploadUtils;import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.Collection;//多文件上传
@WebServlet(name = "MoreUploadController",value = "/moreUpload")
@MultipartConfig(maxFileSize = 1024*1024*100,maxRequestSize = 1024*1024*200)
public class MoreUploadController extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理编码req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");//获取上传文件的路径 真实路径String uploadPath = req.getServletContext().getRealPath("/WEB-INF/upload");File file = new File(uploadPath);if (!file.exists()){//不存在则新建文件夹file.mkdirs();}//获取表单提交的所有数据Collection<Part> parts = req.getParts();for (Part part : parts){String fileName = part.getSubmittedFileName();if (fileName != null){//文件//未选择文件if (fileName.trim().equals("")){continue;}//依次循环上传文件String newName = UploadUtils.newFileName(fileName);//上传文件part.write(uploadPath+"\\"+newName);//响应客户端 上传成功resp.getWriter().println(part.getSubmittedFileName()+"上传成功!");} else {//普通表单项String username = req.getParameter(part.getName());System.out.println(username);}}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}
}

文件下载:

显示文件下载列表:

我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作。

获取文件列表工具类 DownLoadUtils.java

import java.io.File;
import java.util.HashMap;//循环查找指定目录下所有文件
public class DownLoadUtils {public static void getFileList(File file, HashMap<String,String> fileMap){//获取文件集合File[] files = file.listFiles();for (File f : files){if (f.isDirectory()){//目录getFileList(file,fileMap);} else {//文件String fileName = f.getName();//截取文件名int index = fileName.lastIndexOf("_");String realName = fileName.substring(index + 1);fileMap.put(fileName,realName);}}}
}

获取文件列表控制层类 FileListController.java

import com.tyh.utils.DownLoadUtils;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;//获取下载列表
@WebServlet(name = "FileListController",value = "/fileList")
public class FileListController extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置编码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//集合Map key=UUID value=源文件名称HashMap<String,String> fileMap = new HashMap<>();String basePath = req.getServletContext().getRealPath("/WEB-INF/upload");//将查找到的文件添加到Map中DownLoadUtils.getFileList(new File(basePath),fileMap);//存储数据req.setAttribute("fileMap",fileMap);req.getRequestDispatcher("/fileUpload/fileList.jsp").forward(req,resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}
}

显示文件列表页面 fileList.jsp

实现下载文件功能:

为fileList.jsp文件中的超链接标签加上url地址

<a href="${pageContext.request.contextPath}/downLoad?filename=${entry.key}">下载</>

实现下载文件类DownLoad.java

 

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;//下载文件
@WebServlet(name = "DownLoad",value = "/downLoad")
public class DownLoad extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {//设置编码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//获取下载目录String basePath = req.getServletContext().getRealPath("/WEB-INF/upload");//获取Request中的文件filename的UUIDString uuidFileName = req.getParameter("filename");//利用截取获取文件名String filename = uuidFileName.split("_")[1];//设置响应头,响应的文件类型和处理该文件 附件下载resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));//通过输入输出流将源文件下载FileInputStream is = new FileInputStream(basePath+"\\"+uuidFileName);ServletOutputStream out = resp.getOutputStream();byte[] buffer = new byte[1024*1024*100];int len = 0;while ((len = is.read(buffer)) != -1){out.write(buffer,0,len);}//关闭流out.close();is.close();}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}
}

相关文章:

基于Java与JSP的文件上传和下载

概念 当用户在前端页面点击文件上传后&#xff0c;用户上传的文件数据提交给服务器端&#xff0c;实现保存。 文件上传步骤 提交方式&#xff1a; 提供form表单&#xff0c;method必须是post。因为post请求无数据限制。 <form method"post"></form>…...

Gromacs中的g_mmpbsa计算带电底物与蛋白的结合能不准确

g_mmpbsa计算带电底物与蛋白的结合能总是不准确 TOC 在做的两个项目中&#xff0c;利用g_mmpbsa计算带电底物与蛋白的结合能结果非常不可靠&#xff0c;底物带两个硫酸根离子&#xff0c;g_mmpbsa在计算带电的底物与酶的结合能时总是不准确&#xff0c;因此后续若底物带电&…...

【mmrotate】旋转目标检测之训练DOTA数据集

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 mmrotate训练DOTA数据集记录 1. 正文 1.1 数据准备 数据介绍部分&#xff0c;参考DOTA数据介绍&#xff0c;官方提供了裁剪工具development kit。这里…...

图基本概念

图&#xff1a;顶点和边的集合。无向图&#xff1a;每条边都是无方向的有向图&#xff1a;每条边都是有方向的完全图&#xff1a;任意两个点都有一条边相连稀疏图&#xff1a;有很少边或弧的图稠密图&#xff1a;有较多边或弧的图网&#xff1a;边/弧带权的图邻接&#xff1a;有…...

机器学习基础

一、基本概念 1 学习的概念 1975年图灵奖获得者、1978年诺贝尔经济学奖获得者、著名学者赫伯特.西蒙 (Herbert Simon) 曾下过一个定义: 如果一个系统&#xff0c;能够通过执行某个过程&#xff0c;就此改进了它的性能&#xff0c;那么这个过程就是学习.由此可看出&#xff0c;…...

FreeRTOS-Tickless低功耗模式 | FreeRTOS十四

目录 说明&#xff1a; 一、低功耗模式简介 1.1、STM32低功耗模式 二、Tickless模式 2.1、Tickless模式如何功耗 2.2、Tickless模式设计思想 2.3、为了降低功耗&#xff0c;又不影响系统运行&#xff0c;怎么能做到呢&#xff1f; 三、Tickless模式修改配置 3.1、配置…...

实现了统一消息中心的微服务基础框架 JVS,快点赞收藏

一、开源项目简介基于JVS&#xff08;基于spring cloud封装&#xff09;的基础开源框架&#xff0c;实现了基于多对多租户能力的管理系统。二、基础框架实现功能支持数据管理支持分布式定时任务支持分布式日志采集支持系统监控支持动态配置中心支持模板消息支持链路跟踪支持邮件…...

VMware 安装 OpenWrt 旁路由并配置 PassWall

1、准备 OpenWrt 镜像包 我已经转好了 vmdk 格式的&#xff0c;更多的可以去恩山论坛下载 OpenWrtvmdk格式-虚拟化文档类资源-CSDN下载 也可以在这个平台在线定制 OpenWrt固件下载与在线定制编译 2、网络选择 NAT 模式 3、创建虚拟机&#xff0c;选择自定义方式 4、一直下…...

R语言GD包地理探测器分析时报错、得不到结果等情况的解决方案

本文介绍在利用R语言的GD包&#xff0c;实现自变量最优离散化方法选取与执行、地理探测器&#xff08;Geodetector&#xff09;操作时&#xff0c;出现各类报错信息、长时间得不到结果等情况的解决方案。 在之前的文章R语言GD包基于栅格图像实现地理探测器与连续参数的自动离散…...

嵌入式开发:你需要知道的5种简单

传达嵌入式软件体系结构设计意图通常伴随着基于嵌入式开发人员经验的假设。你可以从资源受限的基于微控制器的系统的角度来看架构设计。如何设计架构将取决于系统的嵌入式软件分类。有许多不同的方法可以对嵌入式软件进行分类。我发现有五种简单的嵌入式软件分类可以帮助我调整…...

MVC与MVVM

MVC与MVVM举例说明MVCMVVM两者比较MVC <!DOCTYPE html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>mvc案例</title><link rel"styleshe…...

Cortex-M0异常和中断

目录1.概念2.异常类型3.异常优先级定义4.向量表5.异常流程概述接受异常请求压栈和出栈异常返回指令末尾连锁延迟到达6.EXC_RETURN7.异常入口流程的细节压栈取出向量并更新PC寄存器更新8.异常退出流程的细节1.概念 异常是能够引起程序流偏离正常流程的事件&#xff0c;当异常发…...

数据库(6)--存储过程

一、学习目标 熟悉存储过程的定义和使用&#xff0c;熟练运用 select ,update ,insert ,delete 命令完成对学生信息数据库的查询、更新、添加、删除操作。 二、学习内容 学生&#xff08;学号&#xff0c;年龄&#xff0c;性别&#xff0c;系名&#xff09; 课程&#xff08;…...

c++ 指针、引用和常量

指针、引用和常量的关系_夜悊的博客-CSDN博客 1. ① 指针是对象&#xff0c;引用不是对象&#xff08;在此可以理解为变量&#xff0c;一个变量是一个对象&#xff09; 指针不必须初始化引用只是为一个已经存在的对象所起的另一个名字&#xff08;别名&#xff09;&#xff…...

1、HAL库UART 中断|DMA 自动回显接收数据

1、实现代码&#xff1a; stm32f4xx_hal_conf.h文件开启UART宏定义 #define HAL_UART_MODULE_ENABLED添加stm32f4xx_hal_uart.c和stm32f4xx_hal_dma.c到自己工程&#xff1b; 编写好的代码&#xff1a;usart_Driver.c /***************************************************…...

NPOI - ConditionalFormattingRule

NPOI 给xls(xlsx)创建条件格式 获取 XSSFSheetConditionalFormatting 对象 初始化 IWorkbook _workbook new XSSFWorkbook(); ISheet _dataSheet _workbook.GetSheet("template"); ISheetConditionalFormatting fcs _dataSheet.SheetConditionalFormatting;调用…...

JavaのString类这一篇就够了(包含StringBuffer_Builder)

1.&#x1f957;String类简介 在我们写代码的时候&#xff0c;String总是充斥着前前后后。 但你会不会经常力不从心&#xff0c; “这个*** 字符串怎么** 转换不成功啊” “*** 这个字符串到底是常量还是对象啊” “这*** 字符串内存结构到底* * * 是什么啊” “为啥我的字符串…...

C# dataGridView 导出表格 xls NPOI 2.4.1 版本

using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; try { SaveFileDialog fileDialog new SaveFileDialog(); fileDialog.Filter “Excel(97-2003)|*.xls”; if (fileDialog.ShowDialog() System.Windows.Forms.DialogResult.Cancel) { return; } //不允许dataGridView…...

秒杀项目的消息推送

目录 一、创建消费者 二、创建订单链路配置 1.定义RabbitMQ配置类 2.创建RabbitmqOrderConfig配置类 三、如何实现RabbitMQ重复投递机制 1.开启发送者消息确认模式 2.消息发送确认 ① 创建ConfirmCallBacker确认模式 ② 创建ReturnCallBack退回模式 3.创建生产者 …...

最近开发及 vue3 几个小总结

只是单纯记录一下最近维护了几个项目之后的感触&#xff0c;也只是在自己现在水平上面的一些感觉。发发牢骚&#xff0c;水水文章 是否过度封装 可能水平不够吧&#xff0c;在 axios 封装的时候&#xff0c;只是把响应和拦截还有一些全局的配置封装了一下&#xff0c;并没有加…...

代谢组学分享-花青素通过调节氨基酸代谢改善糖尿病肾病的肾功能

代谢组学文献分享&#xff0c;文章标题&#xff1a;Anthocyanin improves kidney function in diabetic kidney disease by regulating amino acid metabolism 发表期刊&#xff1a;Journal of Translational Medicine 影响因子&#xff1a;8.44 作者单位&#xff1a;中山大…...

超简单!pytorch入门教程:Tensor

超简单&#xff01;pytorch入门教程&#xff1a;Tensor 一、pytorch安装 安装pytorch之前&#xff0c;需要安装好python&#xff08;废话&#xff09;&#xff0c;还没安装过python的宝宝请先移步到廖雪峰的python教程&#xff0c;待安装熟悉完之后&#xff0c;再过来这边。 …...

如何使用COCO数据集,注意事项

COCO数据集可用来训练目标检测&#xff0c;分类&#xff0c;实例分割等。 下面简单说下如何使用这个数据集&#xff0c; 数据集下载可用如下的代码进行&#xff0c;以2017为例。 # Download the image data. cd ./images echo "Downloading MSCOCO train images ...&quo…...

金三银四跳槽季,JAVA面试撸题就来【笑小枫】微信小程序吧~

JAVA面试撸题就来【笑小枫】微信小程序啦~ 疫情已过&#xff0c;金三银四即将到来&#xff0c;小伙伴们是否有跳槽的打算呢&#xff1f;不管有没有&#xff0c;技术不能丢&#xff0c;让我们一起来撸题吧。 博主最近整理了一批面试题&#xff0c;包括JAVA基础、多线程与锁、Red…...

分享115个HTML电子商务模板,总有一款适合您

分享115个HTML电子商务模板&#xff0c;总有一款适合您 115个HTML电子商务模板下载链接&#xff1a;https://pan.baidu.com/s/158y3jP0tv7ZikxNOBMKsSg?pwdt970 提取码&#xff1a;t970 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 import os import shuti…...

Python 字符串

字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。创建字符串很简单&#xff0c;只要为变量分配一个值即可。例如&#xff1a;var1 Hello World!var2 "Python Runoob"Python 访问字符串中的值Python 不支持单字符类型&#xff…...

总线定义,车载总线:车载etherNet or CAN

总线的定义总线是连接多个设备或者接入点的数据传输通路。这里面的关键词是多个设备或者接入点&#xff0c;所以不要过于局限的看待总线。根据互联的设备/接入点不同&#xff0c;传输的数据带宽&#xff0c;速率&#xff0c;距离不同和应用场景的不同都可能有不同的总线。不同的…...

Python(for和while)循环嵌套及用法

Python 不仅支持 if 语句相互嵌套&#xff0c;while 和 for 循环结构也支持嵌套。 所谓嵌套&#xff08;Nest&#xff09;&#xff0c;就是一条语句里面还有另一条语句&#xff0c;例如 for 里面还有 for&#xff0c;while 里面还有 while&#xff0c;甚至 while 中有 for 或者…...

6万字电力行业系统解决方案光伏电站综合安防系统解决方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目录 第 一 章背景与需求 1.1行…...

[Android Studio]Android 数据存储--SQLite数据库存储

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f4cb;笔记目…...

校园网站建设规划书/台州seo排名公司

链接&#xff1a; https://www.lydsy.com/JudgeOnline/problem.php?id1699 思路&#xff1a; 水题&#xff0c;求区间最大最小值&#xff0c;然后减一下&#xff0c;求区间最大最小值线段树&#xff0c;树状数组&#xff0c;分块&#xff0c;莫队都可以&#xff0c;这里直接用…...

公司网站用哪个软件做/建网络平台要多少费用

LinkLinkLink JZOJJZOJJZOJ 391039103910 DescriptionDescriptionDescription InputInputInput 第一行两个正整数n 和m&#xff0c;分别表示间谍网络中的特工总数&#xff0c;以及事件的总数。 接下来m 行&#xff0c;第i 行给出第i 个事件的信息&#xff0c;格式及含义参见题…...

网站地图模板.zip/大众点评seo关键词优化

文件传输协议FTP是一种仍在使用的协议&#xff0c;在上载和下载文件时仍然比较流行&#xff0c;通常是那些太大的文件&#xff0c;需要花费很长时间才能通过常规电子邮件程序作为附件下载进行传输。 从技术上讲&#xff0c;它是“文件传输实用程序”&#xff0c;是许多TCP / I…...

福州做网站多少钱/seo关键词推广方式

blog.sina.com.cn/s/blog_76a8d80b01018jnf.html Jquery hover 事件中在 IE 中存在的 BUG December 15th 2011评论(11) Jquery 也有 BUG &#xff1f; 是的&#xff01;Jquery hover 事件在 IE 中就存在 Bug &#xff01; 因为帮朋友做一个在 elegant-box 主题中的特效要用到 J…...

免费的百度网站怎么做/软文推广收费

从设计模块化企业应用程序的每个人,我有兴趣知道你如何看待模块化以及你究竟是什么参数&#xff1f;>基于层的模块化(如控制器/ Web模块,服务模块,域模块)是更好的方法吗&#xff1f;>或基于特征的模块化更好&#xff1f;为什么&#xff1f;>在基于特征的模块化的情况…...

作文生成器/seo诊断a5

运算跨导放大器市场的企业竞争态势 该报告涉及的主要国际市场参与者有Texas Instruments、ON Semiconductor、Intersil、NJR、Triad Semiconductor、National Semiconductor、Stromeko、RCA、NTE Electronics、NXP Semiconductors等。这些参与者的市场份额、收入、公司概况和SW…...