【Java编码】Java原生实现上传下载文件

Java实现上传下载文件

一、上传源码

	/*** 1. 上传*/private void upload(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {// 1. 创建工厂对象FileItemFactory factory = new DiskFileItemFactory();// 2. 文件上传核心工具类ServletFileUpload upload = new ServletFileUpload(factory);// 设置大小限制参数upload.setFileSizeMax(10*1024*1024);	// 单个文件大小限制upload.setSizeMax(50*1024*1024);		// 总文件大小限制upload.setHeaderEncoding("UTF-8");		// 对中文文件编码处理// 判断if (upload.isMultipartContent(request)) {// 3. 把请求数据转换为list集合List<FileItem> list = upload.parseRequest(request);// 遍历for (FileItem item : list){// 判断:普通文本数据if (item.isFormField()){// 获取名称String name = item.getFieldName();// 获取值String value = item.getString();System.out.println(value);} // 文件表单项else {/******** 文件上传 ***********/// a. 获取文件名称String name = item.getName();// ----处理上传文件名重名问题----// a1. 先得到唯一标记String id = UUID.randomUUID().toString();// a2. 拼接文件名name = id + "#" + name;						// b. 得到上传目录String basePath = getServletContext().getRealPath("/upload");// c. 创建要上传的文件对象File file = new File(basePath,name);// d. 上传item.write(file);item.delete();  // 删除组件运行时产生的临时文件}}}} catch (Exception e) {e.printStackTrace();}}

二、下载源码

	/***  2.下载*/private void down(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取用户下载的文件名称(url地址后追加数据,get)String fileName = request.getParameter("fileName");fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");// 先获取上传目录路径String basePath = getServletContext().getRealPath("/upload");// 获取一个文件流InputStream in = new FileInputStream(new File(basePath,fileName));// 如果文件名是中文,需要进行url编码fileName = URLEncoder.encode(fileName, "UTF-8");// 设置下载的响应头response.setHeader("content-disposition", "attachment;fileName=" + fileName);// 获取response字节流OutputStream out = response.getOutputStream();byte[] b = new byte[1024];int len = -1;while ((len = in.read(b)) != -1){out.write(b, 0, len);}// 关闭out.close();in.close();
}

三、测试案例

package cn.demo.servlet;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;/*** 处理文件上传与下载* @author Douglas*/
public class FileServlet extends HttpServlet {/*** 请求入口*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取请求参数: 区分不同的操作类型String method = request.getParameter("method");if ("upload".equals(method)) {// 上传upload(request,response);}else if ("downList".equals(method)) {// 进入下载列表downList(request,response);}else if ("down".equals(method)) {// 下载down(request,response);}}/*** 1. 上传*/private void upload(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {// 1. 创建工厂对象FileItemFactory factory = new DiskFileItemFactory();// 2. 文件上传核心工具类ServletFileUpload upload = new ServletFileUpload(factory);// 设置大小限制参数upload.setFileSizeMax(10*1024*1024);	// 单个文件大小限制upload.setSizeMax(50*1024*1024);		// 总文件大小限制upload.setHeaderEncoding("UTF-8");		// 对中文文件编码处理// 判断if (upload.isMultipartContent(request)) {// 3. 把请求数据转换为list集合List<FileItem> list = upload.parseRequest(request);// 遍历for (FileItem item : list){// 判断:普通文本数据if (item.isFormField()){// 获取名称String name = item.getFieldName();// 获取值String value = item.getString();System.out.println(value);} // 文件表单项else {/******** 文件上传 ***********/// a. 获取文件名称String name = item.getName();// ----处理上传文件名重名问题----// a1. 先得到唯一标记String id = UUID.randomUUID().toString();// a2. 拼接文件名name = id + "#" + name;						// b. 得到上传目录String basePath = getServletContext().getRealPath("/upload");// c. 创建要上传的文件对象File file = new File(basePath,name);// d. 上传item.write(file);item.delete();  // 删除组件运行时产生的临时文件}}}} catch (Exception e) {e.printStackTrace();}	}/*** 2. 进入下载列表*/private void downList(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示//1. 初始化map集合Map<包含唯一标记的文件名, 简短文件名>  ;Map<String,String> fileNames = new HashMap<String,String>();//2. 获取上传目录,及其下所有的文件的文件名String bathPath = getServletContext().getRealPath("/upload");// 目录File file = new File(bathPath);// 目录下,所有文件名String list[] = file.list();// 遍历,封装if (list != null && list.length > 0){for (int i=0; i<list.length; i++){// 全名String fileName = list[i];// 短名String shortName = fileName.substring(fileName.lastIndexOf("#")+1);// 封装fileNames.put(fileName, shortName);}}// 3. 保存到request域request.setAttribute("fileNames", fileNames);// 4. 转发request.getRequestDispatcher("/downlist.jsp").forward(request, response);}/***  3. 处理下载*/private void down(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取用户下载的文件名称(url地址后追加数据,get)String fileName = request.getParameter("fileName");fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");// 先获取上传目录路径String basePath = getServletContext().getRealPath("/upload");// 获取一个文件流InputStream in = new FileInputStream(new File(basePath,fileName));// 如果文件名是中文,需要进行url编码fileName = URLEncoder.encode(fileName, "UTF-8");// 设置下载的响应头response.setHeader("content-disposition", "attachment;fileName=" + fileName);// 获取response字节流OutputStream out = response.getOutputStream();byte[] b = new byte[1024];int len = -1;while ((len = in.read(b)) != -1){out.write(b, 0, len);}// 关闭out.close();in.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

注意:有用记得点收藏哟!

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

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

相关文章

【学习】focal loss 损失函数

focal loss用于解决正负样本的不均衡情况 通常我们需要预测的正样本要少于负样本&#xff0c;正负样本分布不均衡会带来什么影响&#xff1f;主要是两个方面。 样本不均衡的话&#xff0c;训练是低效不充分的。因为困难的正样本数量较少&#xff0c;大部分时间都在学习没有用…

Linux学习记录——사십사 高级IO(5)--- Epoll型服务器(2)(Reactor)

文章目录 1、完善Epoll简单服务器2、打造统一的分开处理的体系3、epoll工作模式4、ET模式5、继续完善&#xff0c;处理写事件6、引入自定义协议&#xff0c;处理写事件 本篇基于上篇代码继续改进&#xff0c;很长。关于Reactor的说明在后一篇 1、完善Epoll简单服务器 上面的代…

216. 组合总和 III - 力扣(LeetCode)

题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 输入示例 k 3, n 7输出示例 [[1,2,…

深入理解Kubernetes探针和.NET服务健康检查机制

前言 随着越来越多的软件采用云原生和微服务架构&#xff0c;我们面临着更多的技术挑战&#xff0c;比如&#xff1a; Kubernetes如何在容器服务异常终止、死锁等情况下&#xff0c;发现并自动重启服务&#xff1b;当服务依赖的关键服务&#xff08;例如数据库&#xff0c;Red…

【2024-01-22】某极验3流程分析-滑块验证码

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、抓包流程分析1.刷新页面2.点击按钮进行验证3.滑动验证码三、图片还原四、w值①u值②l值③h值④l中的o值aa参…

Dockerfile-xxxx

1、Dockerfile-server FROM openjdk:8-jdk-alpine WORKDIR /app COPY . . CMD java -Xms1536M -Xmx1536M -XX:UseG1GC -jar -Dlog4j2.formatMsgNoLookupstrue -Dloader.pathresources,lib -Duser.timezoneGMT-05 /app/server-main-1.0.0.jar 2、Dockerfile-bgd #FROM openjdk…

8. UE5 RPG创建UI(上)

UI是显示角色的一部分属性玩家可以直接查看的界面&#xff0c;通过直观的形式在屏幕上显示角色的各种信息。如何使用一种可扩展&#xff0c;可维护的形式来制作&#xff0c;这不得不说到耳熟能详的MVC架构。 MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件…

如何在Linux上部署Nexus私服

如何在Linux上部署Nexus私服 Nexus 是一个强大的仓库管理解决方案&#xff0c;由Sonatype公司开发。它主要用于软件开发中各种依赖包和构件的存储、管理和分发。 1、为什么要部署nexus&#xff1f; 统一管理依赖&#xff1a;在软件开发过程中&#xff0c;项目通常会依赖大量的…

[Linux 杂货铺] —— 权限(文件权限和目录配置)

目录 &#x1f308;前言 &#x1f4c1; 文件的属性 &#x1f4c1; 权限的概念 &#x1f4c2;拥有者和所属组&#xff08;角色&#xff09;&#xff1a; &#x1f4c2;用户&#xff08;具体的人&#xff09;&#xff1a; &#x1f4c1; 权限的管理 &#x1f4c2;1. chmod…

如何让亚马逊,速卖通,美客多店铺排名和流量稳定爬升

一、关键词优化 关键词是亚马逊店铺排名的关键。通过合理的关键词优化&#xff0c;可以提高店铺的曝光率。卖家需要研究消费者的搜索习惯和行为&#xff0c;了解他们使用哪些关键词进行搜索&#xff0c;然后将这些关键词用于商品描述、标题和元数据中。此外&#xff0c;还可以…

免费可用的ChatGPT替代方案

最近ChatGPT又不好访问了&#xff0c;整理了一些可以替代的方案&#xff0c;测了下可以使用&#xff0c;按照自己的喜好选择。 国外可用的GPT Poe - Fast, Helpful AI Chat - 它提供了对GPT-4、gpt-3.5-turbo、Anthropic的Claude以及其他多种机器人的访问权限。HuggingChat -…

Linux - 安装字体库解决乱码问题

文章目录 问题描述步骤资源 问题描述 该安装方法&#xff0c;不区分中文和英文字体 Java在linux上转word文档为pdf&#xff0c; linux的字体缺失&#xff0c;导致了转出的pdf为乱码。 ● Linux将word转为pdf后出现乱码&#xff1f; ● 在linux上将word转为pdf 是乱码 ● 在lin…

第一篇【传奇开心果短博文系列】Python的库OpenCV技术点案例示例:cv2常用功能和方法

传奇开心果短博文系列 短博文系列目录Python的库OpenCV技术点案例示例系列 短博文目录一、前言二、常用功能和方法示例三、归纳总结 短博文系列目录 Python的库OpenCV技术点案例示例系列 短博文目录 一、前言 cv2是Python中常用的第三方库&#xff0c;也称为OpenCV库&#…

在全志H616核桃派上实现USB摄像头的OpenCV颜色检测

在给核桃派开发板用OpenCV读取图像并显示到pyqt5的窗口上并加入颜色检测功能&#xff0c;尝试将图像中所有蓝色的东西都用一个框标记出来。 颜色检测核心api 按照惯例&#xff0c;先要介绍一下opencv中常用的hsv像素格式。颜色还是那个颜色&#xff0c;只是描述颜色用的参数变…

uniapp PDF文件预览/打开

兼容微信小程序/h5/ios/android 在微信小程序环境下需要配置pdf域名 pdfPreview(url){var title 预览uni.showLoading({ title: 加载中, mask: true })//由于android 下webview无法直接打开pdf&#xff0c;需要先下载uni.getSystemInfo({success: res > {console.log(res.p…

【C语言编程之旅 7】刷题篇-函数

第1题 解析 A&#xff1a;错误&#xff0c;一个函数只能返回一个结果 B&#xff1a;正确&#xff0c;将形参存在数组中&#xff0c;修改数组中内容&#xff0c;可以通过数组将修改结果带出去 C&#xff1a;正确&#xff0c;形参如果用指针&#xff0c;最终指向的是外部的实参…

【笔记】stable_baseline 记录输出说明

训练 PPO 代理时的记录器输出示例&#xff1a; ----------------------------------------- | eval/ | | | mean_ep_length | 200 | | mean_reward | -157 | | rollout/ | | |…

SpringBoot3.1.7集成Kafka和Kafka安装

一、背景 我们在很多系统开发都需要用到消息中间件&#xff0c;目前来说Kafka凭借其优秀的性能&#xff0c;使得它的使用率已经是名列前茅了&#xff0c;所以今天我们将它应用到我们的系统 二、版本选择 在使用一个中间件一定要考虑版本的兼容性&#xff0c;否则后面会遇到很…

美易官方:Amer Sports寻求美国IPO大举筹资

随着全球资本市场的活跃&#xff0c;各行各业的公司都在寻找更多的融资途径以支持其业务扩展和市场竞争力的提升。近日&#xff0c;知名体育用品制造商Amer Sports Inc.宣布计划通过美国首次公开募股&#xff08;IPO&#xff09;筹集高达18亿美元的资金&#xff0c;这一消息引发…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-3 线性二次型调节器(LQR)

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-3 线性二次型调节器&#xff08;LQR&#xff09; 1. 数学推导2. 案例反洗与代码详解 1. 数学推导 2. 案例反洗与代码详解