SpringMVC之文件上传下载

SpringMVC之文件上传下载

  • 一、文件上传
  • 二、文件下载
  • 三、多文件上传

一、文件上传

配置多功能视图解析器(spring-mvc.xml):在Spring MVC的配置文件(spring-mvc.xml)中配置多功能视图解析器,以支持文件上传。

添加文件上传页面(upload.jsp):创建一个名为upload.jsp的JSP页面,用于用户上传文件。

做硬盘网络路径映射:配置服务器的硬盘路径映射到网络路径,确保上传的文件可以被访问和处理。

编写一个处理页面跳转的类:创建一个处理页面跳转的Java类,比如PageController.java或ClazzController.java,用于处理上传文件后的页面跳转逻辑。

package com.niyin.web;import com.niyin.biz.tyBiz;
import com.niyin.model.ty;
import com.niyin.utils.PageBean;
import com.niyin.utils.PropertiesUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;@Controller
@RequestMapping("/clz")
public class tyController {@Autowiredprivate tyBiz tyBiz;@RequestMapping("/list")public String list(ty t, HttpServletRequest request){PageBean pageBeanage=new PageBean();pageBeanage.setRequest(request);List<ty> books = tyBiz.selectByPager(t, pageBeanage);request.setAttribute("lst",books);request.setAttribute("pageBean",pageBeanage);return "list";};@RequestMapping("/add")public String add(ty t){int i = tyBiz.insertSelective(t);return "redirect:list";};@RequestMapping("/del")public String del(ty t){tyBiz.deleteByPrimaryKey(t.getTid());return "redirect:list";};@RequestMapping("/edit")public String edit(ty t){tyBiz.updateByPrimaryKeySelective(t);return "redirect:list";};@RequestMapping("/preSave")public String preSave(ty t, Model model) {if (t!=null&&t.getTid()!=null&&t.getTid()!=0){ty ts = tyBiz.selectByPrimaryKey(t.getTid());model.addAttribute("ts",ts);}return "edit";}@RequestMapping("/upload")
public  String upload(ty t,MultipartFile cfile){try {String dir= PropertiesUtil.getValue("dir");String server=PropertiesUtil.getValue("server");String Filename = cfile.getOriginalFilename();System.out.println("文件名"+Filename);System.out.println("文件类别"+cfile.getContentType());t.setTimage(server+Filename);tyBiz.updateByPrimaryKeySelective(t);FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+Filename));} catch (IOException e) {e.printStackTrace();}return "redirect:list";
}@RequestMapping(value="/download")public ResponseEntity<byte[]> download(ty t,HttpServletRequest req){try {//先根据文件id查询对应图片信息 ty ts = this.tyBiz.selectByPrimaryKey(t.getTid());String diskPath = PropertiesUtil.getValue("dir");String reqPath = PropertiesUtil.getValue("server");String realPath = ts.getTimage().replace(reqPath,diskPath);String fileName = realPath.substring(realPath.lastIndexOf("/")+1);//下载关键代码File file=new File(realPath);HttpHeaders headers = new HttpHeaders();//http头信息String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码headers.setContentDispositionFormData("attachment", downloadFileName);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);}catch (Exception e){e.printStackTrace();}return null;}@RequestMapping("/uploads")public String uploads(HttpServletRequest req, ty t, MultipartFile[] files){try {StringBuffer sb = new StringBuffer();for (MultipartFile cfile : files) {//思路://1) 将上传图片保存到服务器中的指定位置String dir = PropertiesUtil.getValue("dir");String server = PropertiesUtil.getValue("server");String filename = cfile.getOriginalFilename();FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));sb.append(filename).append(",");}System.out.println(sb.toString());} catch (Exception e) {e.printStackTrace();}return "redirect:list";}}
package com.niyin.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class PageController {
@RequestMapping("/page/{page}")
public String toPage(@PathVariable("page") String page){return page;
}@RequestMapping("/page/{dir}/{page}")public String toDirPage(@PathVariable("dir") String dir,@PathVariable("page") String page){return dir + "/"+ page;}@RequestMapping("/order/presave")public String orderpre() {return "/order/presave";}@RequestMapping("/clz/presave")public String clzerpre() {return "/clz/presave";}}

初步模拟上传文件:实现一个初步的文件上传功能,可以将上传的文件保存到服务器指定的目录。
在这里插入图片描述

配置目录的配置文件:创建一个配置文件(比如resource.properties),用于配置上传文件保存的目录。

dir=D:/temp/upload/
server=/upload/

最终实现文件上传并显示:完成文件上传功能的开发,同时可以在页面上显示上传的文件列表或其他相关信息。
在这里插入图片描述

二、文件下载

方法代码:编写一个方法代码,用于处理文件下载请求。该方法根据请求参数或文件路径,读取相应的文件,并将文件内容写入HTTP响应流中,实现文件下载。

package com.niyin.web;import com.niyin.biz.tyBiz;
import com.niyin.model.ty;
import com.niyin.utils.PageBean;
import com.niyin.utils.PropertiesUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;@Controller
@RequestMapping("/clz")
public class tyController {@Autowiredprivate tyBiz tyBiz;@RequestMapping("/list")public String list(ty t, HttpServletRequest request){PageBean pageBeanage=new PageBean();pageBeanage.setRequest(request);List<ty> books = tyBiz.selectByPager(t, pageBeanage);request.setAttribute("lst",books);request.setAttribute("pageBean",pageBeanage);return "list";};@RequestMapping("/add")public String add(ty t){int i = tyBiz.insertSelective(t);return "redirect:list";};@RequestMapping("/del")public String del(ty t){tyBiz.deleteByPrimaryKey(t.getTid());return "redirect:list";};@RequestMapping("/edit")public String edit(ty t){tyBiz.updateByPrimaryKeySelective(t);return "redirect:list";};@RequestMapping("/preSave")public String preSave(ty t, Model model) {if (t!=null&&t.getTid()!=null&&t.getTid()!=0){ty ts = tyBiz.selectByPrimaryKey(t.getTid());model.addAttribute("ts",ts);}return "edit";}@RequestMapping("/upload")
public  String upload(ty t,MultipartFile cfile){try {String dir= PropertiesUtil.getValue("dir");String server=PropertiesUtil.getValue("server");String Filename = cfile.getOriginalFilename();System.out.println("文件名"+Filename);System.out.println("文件类别"+cfile.getContentType());t.setTimage(server+Filename);tyBiz.updateByPrimaryKeySelective(t);FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+Filename));} catch (IOException e) {e.printStackTrace();}return "redirect:list";
}@RequestMapping(value="/download")public ResponseEntity<byte[]> download(ty t,HttpServletRequest req){try {//先根据文件id查询对应图片信息 ty ts = this.tyBiz.selectByPrimaryKey(t.getTid());String diskPath = PropertiesUtil.getValue("dir");String reqPath = PropertiesUtil.getValue("server");String realPath = ts.getTimage().replace(reqPath,diskPath);String fileName = realPath.substring(realPath.lastIndexOf("/")+1);//下载关键代码File file=new File(realPath);HttpHeaders headers = new HttpHeaders();//http头信息String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码headers.setContentDispositionFormData("attachment", downloadFileName);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);}catch (Exception e){e.printStackTrace();}return null;}@RequestMapping("/uploads")public String uploads(HttpServletRequest req, ty t, MultipartFile[] files){try {StringBuffer sb = new StringBuffer();for (MultipartFile cfile : files) {//思路://1) 将上传图片保存到服务器中的指定位置String dir = PropertiesUtil.getValue("dir");String server = PropertiesUtil.getValue("server");String filename = cfile.getOriginalFilename();FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));sb.append(filename).append(",");}System.out.println(sb.toString());} catch (Exception e) {e.printStackTrace();}return "redirect:list";}}

JSP页面代码:创建一个JSP页面,用于触发文件下载请求。在该页面中,可以使用超链接或按钮等方式触发文件下载的方法。

<%--Created by IntelliJ IDEA.User: 林墨Date: 2023/9/9Time: 14:20To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>头像上传</title>
</head>
<body>
<form action="${ctx}/clz/upload" method="post" enctype="multipart/form-data"><label>班级编号:</label><input type="text" name="tid" readonly="readonly" value="${param.tid}"/><br/><label>班级图片:</label><input type="file" name="cfile"/><br/><input type="submit" value="上传图片"/>
</form><form method="post" action="${ctx}/clz/uploads" enctype="multipart/form-data"><input type="file" name="files" multiple><button type="submit">上传</button></form>
</body>
</html>

效果测试:运行应用程序,访问下载页面,并点击下载链接或按钮,验证文件下载功能是否正常工作。
在这里插入图片描述

三、多文件上传

jsp页面显示代码:修改上传页面(upload.jsp),支持同时上传多个文件。可以使用HTML的input标签设置multiple属性,以允许选择多个文件。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>博客的编辑界面</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/clz/${empty ts ? 'add' : 'edit'}" method="post">id:<input type="text" name="tid" value="${ts.tid }"><br>bname:<input type="text" name="tname" value="${ts.tname }"><br>price:<input type="text" name="tprice" value="${ts.tprice }"><br>price:<input type="text" name="tiamge" value="${ts.timage}"><br><input type="submit">
</form>
</body>
</html>

多文件上传方法:修改文件上传处理逻辑,使其能够处理同时上传的多个文件。可以使用循环遍历的方式,依次处理每个上传的文件。

package com.niyin.web;import com.niyin.biz.tyBiz;
import com.niyin.model.ty;
import com.niyin.utils.PageBean;
import com.niyin.utils.PropertiesUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;@Controller
@RequestMapping("/clz")
public class tyController {@Autowiredprivate tyBiz tyBiz;@RequestMapping("/list")public String list(ty t, HttpServletRequest request){PageBean pageBeanage=new PageBean();pageBeanage.setRequest(request);List<ty> books = tyBiz.selectByPager(t, pageBeanage);request.setAttribute("lst",books);request.setAttribute("pageBean",pageBeanage);return "list";};@RequestMapping("/add")public String add(ty t){int i = tyBiz.insertSelective(t);return "redirect:list";};@RequestMapping("/del")public String del(ty t){tyBiz.deleteByPrimaryKey(t.getTid());return "redirect:list";};@RequestMapping("/edit")public String edit(ty t){tyBiz.updateByPrimaryKeySelective(t);return "redirect:list";};@RequestMapping("/preSave")public String preSave(ty t, Model model) {if (t!=null&&t.getTid()!=null&&t.getTid()!=0){ty ts = tyBiz.selectByPrimaryKey(t.getTid());model.addAttribute("ts",ts);}return "edit";}@RequestMapping("/upload")
public  String upload(ty t,MultipartFile cfile){try {String dir= PropertiesUtil.getValue("dir");String server=PropertiesUtil.getValue("server");String Filename = cfile.getOriginalFilename();System.out.println("文件名"+Filename);System.out.println("文件类别"+cfile.getContentType());t.setTimage(server+Filename);tyBiz.updateByPrimaryKeySelective(t);FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+Filename));} catch (IOException e) {e.printStackTrace();}return "redirect:list";
}@RequestMapping(value="/download")public ResponseEntity<byte[]> download(ty t,HttpServletRequest req){try {//先根据文件id查询对应图片信息 ty ts = this.tyBiz.selectByPrimaryKey(t.getTid());String diskPath = PropertiesUtil.getValue("dir");String reqPath = PropertiesUtil.getValue("server");String realPath = ts.getTimage().replace(reqPath,diskPath);String fileName = realPath.substring(realPath.lastIndexOf("/")+1);//下载关键代码File file=new File(realPath);HttpHeaders headers = new HttpHeaders();//http头信息String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码headers.setContentDispositionFormData("attachment", downloadFileName);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);}catch (Exception e){e.printStackTrace();}return null;}@RequestMapping("/uploads")public String uploads(HttpServletRequest req, ty t, MultipartFile[] files){try {StringBuffer sb = new StringBuffer();for (MultipartFile cfile : files) {//思路://1) 将上传图片保存到服务器中的指定位置String dir = PropertiesUtil.getValue("dir");String server = PropertiesUtil.getValue("server");String filename = cfile.getOriginalFilename();FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));sb.append(filename).append(",");}System.out.println(sb.toString());} catch (Exception e) {e.printStackTrace();}return "redirect:list";}}

测试多文件上传:通过在上传页面选择多个文件并点击上传按钮,测试多文件上传功能是否正常工作。
在这里插入图片描述
在这里插入图片描述
可以看到已经成功了

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

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

相关文章

C++11 新特性 ⑤ | 仿函数与 lambda 表达式

目录 1、引言 2、仿函数 3、lambda表达式 3.1、lambda表达式的一般形式 3.2、返回类型说明 3.3、捕获列表的规则 3.4、可以捕获哪些变量 3.5、lambda表达式给编程带来的便利 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

PyTorch实现注意力机制及使用方法汇总,附30篇attention论文

还记得鼎鼎大名的《Attention is All You Need》吗&#xff1f;不过我们今天要聊的重点不是transformer&#xff0c;而是注意力机制。 注意力机制最早应用于计算机视觉领域&#xff0c;后来也逐渐在NLP领域广泛应用&#xff0c;它克服了传统的神经网络的的一些局限&#xff0c…

JAVAEE初阶相关内容第十一弹--多线程(进阶)

目录 一、常见的锁策略 1乐观锁VS悲观锁 1.1乐观锁 1.2悲观锁 2.轻量级锁VS重量级锁 2.1轻量级锁 2.2重量级锁 3.自旋锁VS挂起等待锁 3.1自旋锁 3.2挂起等待锁 4.互斥锁VS读写锁 4.1互斥锁 4.2读写锁 5.公平锁VS非公平锁 5.1公平锁 5.2非公平锁 6.可重入锁VS不…

MemJam: A false Dependency attack against constant-time crypto implementations

作者&#xff1a;A. Moghimi, J. Wichelmann, T. Eisenbarth, and B. Sunar. 发布&#xff1a;International Journal of Parallel Programming 时间&#xff1a;Aug 2019. 笔记&#xff1a; 缓存定时攻击 1、攻击原理 共享缓存存在定时侧信道的风险&#xff08;例如在处理…

设计模式课件

设计模式 创建型设计模式的分类&#xff0c;定义结构型设计模式的分类&#xff0c;定义行为型设计模式的分类&#xff0c;定义 设计模式的分类&#xff0c;在23种设计模式中&#xff0c;每一种属于哪一种的设计模式设计模式的应用场景设计模式的图形&#xff08;考察较少&#…

华为云云耀云服务器L实例评测|带宽,磁盘,CPU,内存以及控制台监控测试

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;AWS/阿里云资深使用…

Python从零到一构建项目

随着互联网的发展&#xff0c;网络上的信息量急剧增长&#xff0c;而获取、整理和分析这些信息对于很多人来说是一项艰巨的任务。而Python作为一种功能强大的编程语言&#xff0c;它的爬虫能力使得我们能够自动化地从网页中获取数据&#xff0c;大大提高了效率。本文将分享如何…

【技术分享】RK Android11系统SD卡启动方法

本文基于Purple Pi OH 3566主板&#xff0c;介绍Android11源码的修改&#xff0c;获得可从SD卡启动的Android11系统镜像。 Purple Pi OH作为一款兼容树莓派的开源主板&#xff0c;采用瑞芯微RK3566 (Cortex-A55) 四核64位超强CPU,主频最高达1.8 GHz,算力高达1Tops&#xff0c;…

海外商城小程序如何开发

随着全球化的发展和人们对跨境购物的需求逐渐增加&#xff0c;海外商城小程序成为了众多电商平台的重要组成部分。本文将深入探讨如何搭建海外商城小程序&#xff0c;从技术实现到用户体验设计&#xff0c;为开发者提供专业且有深度的思考&#xff0c;以帮助他们打造出色的跨境…

手写RPC框架--13.优雅停机

优雅停机 优雅停机a.优雅停机概述b.服务端实现优雅停机c.客户端实现优雅停机d.优雅启动 优雅停机 a.优雅停机概述 当我们快速关闭服务提供方时&#xff0c;注册中心感知、以及通过watcher机制通知调用方一定不能做到实时&#xff0c;一定会有延时&#xff0c;同时我们的心跳检…

如何把视频格式转换成mp4?支持的格式种类非常多。

如何把视频格式转换成mp4&#xff1f;随着计算机技术的迅猛发展&#xff0c;我们现在有着各种各样的视频格式可供选择&#xff0c;平时我们都知道的mp4、flv、mov、mkv、avi、wmv等&#xff0c;都是视频格式的种类。其中&#xff0c;MP4是一种具有极佳兼容性的视频格式&#xf…

TikTok魔法:揭秘那个“神奇”的算法

嘿&#xff0c;你是不是每次打开TikTok&#xff0c;都感觉这个应用好像了解你的内心世界一样&#xff1f;没错&#xff0c;背后有一个不为人知、神奇的算法正在起作用&#xff0c;让你欲罢不能。在这篇文章中&#xff0c;我们将揭开TikTok算法的神秘面纱&#xff0c;看看它是如…

车机多用户系统的适配问题

多用户问题出现背景 记录一下多用户的适配问题&#xff1a; 背景是system/app下面新push了两个apk&#xff0c;一个是我们的业务场景apk一个是虚拟车CarService服务的apk&#xff0c;我们的apk需要链接CarService服务通过AIDL通信。 下面这两张图是未roo的情况&#xff08;当…

Python之Xlwings操作excel

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、xlwings简介二、安装与使用1.安装2.使用3.xlwings结构说明 二、xlwings对App常见的操作App基础操作工作簿的基础操作工作表的基础操作工作表其他操作 读取单元格…

MOV导出序列帧并在Unity中播放

MOV导出序列帧并在Unity中播放 前言项目将MOV变成序列帧使用TexturePacker打成一个图集将Json格式精灵表转换为tpsheet格式精灵表导入Unity并播放总结 鸣谢 前言 收集到一批还不错的MG动画&#xff0c;想要在Unity中当特效播放出来&#xff0c;那首先就得把MOV变成序列帧&…

堆排序与TopK问题

一、堆排序 堆排序(升序)&#xff1a;堆排序的思想就是先用数组模拟建大堆&#xff0c;然后把根结点与最后一个结点值交换&#xff0c;最后一个结点的值就是最大值&#xff0c;然后再把前(n-1)个元素重新建大堆&#xff0c;然后根结点与最后一个结点值交换&#xff0c;就找出了…

小红书笔记爬虫

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

LNMP架构搭建论坛

目录 一、LNMP简介&#xff1a; 二、LNMP搭建&#xff1a; 1.前提准备&#xff1a; 关闭防火墙和安全机制&#xff1a; 2.编译安装nginx&#xff1a; 3.编译安装mysql&#xff1a; 3.1 安装依赖环境&#xff1a; 3.2 创建mysql运行用户&#xff1a; 3.3 编译安装&#xff1a…

c语言练习题52:写一个函数判断当前机器是大端还是小端

代码&#xff1a; #include<stdio.h> int check_sys() {int a 1;return *(char*)&a;//小端retrun 1 大端return 0&#xff1b; } int main() {if (check_sys() 1) {printf("小端\n");}elseprintf("大端\n"); } 这里首先取a的地址&#xff0c…

原型链(一定要搞懂啊!!!>-<)

一、概念 1、prototype 习惯称作“显示原型”&#xff0c;只有构造函数才有的属性。 2、构造函数 能用new关键字创建的对象叫做构造函数 3、__proto__ 习惯称作“隐式原型”&#xff0c;每一个实例都有的属性&#xff0c;该属性指向他构造函数的“显示原型”。Function对象…