Springboot(九).多文件上传下载文件(并将url存入数据库表中)
一. 文件上传
这里我们使用request.getSession().getServletContext().getRealPath("/static")的方式来设置文件的存储路径,并存入数据库中
request.getSession().getServletContext() 获取的是Servlet容器对象,相当于tomcat容器了。getRealPath("/") 获取实际路径,“/”指代项目根目录,所以代码返回的是项目在容器中的实际发布运行的根路径
这里我的文件就保存在了tomcat容器:C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.4580300150688111201.8080\static下
当我们部署到linux的时候,文件就保存在了/tmp/tomcat-docbase.6117940652560190565.8088/static/下
Controller:
- /**
- * 多文件上传接口
- * */
- @ResponseBody
- @RequestMapping(value = "/fileUpload", produces = "application/json;charset=UTF-8")
- public JSONObject fileUpload(@RequestParam("file") MultipartFile[] files, HttpServletRequest request) throws Exception{
- String serverName = "文件上传";
- VirgoLog.updateStep(CONTROLLER_NAME_DES,serverName);
- List<FileManage> fileManages = fileService.fileUpload(files,request);
- Map<String,Object> resMap = new HashMap<String,Object>();
- //0:操作成功
- resMap.put("code", ErrorCode.ERR_SUCCEED.getErrorCode());
- resMap.put("desc",ErrorCode.ERR_SUCCEED.getErrorMessage());
- resMap.put("fileInfo",fileManages);
- return JSON.parseObject(JSONConvertor.toJSON(resMap));
- }
service 文件上传业务类
- /**
- * 文件上传service
- * @param files
- * @throws Exception
- */
- @Override
- public void fileUpload(@RequestParam("file")MultipartFile[] files, HttpServletRequest request) throws Exception {
- //文件命名
- //保存时的文件名
- for(int i=0;i<files.length;i++) {
- //保存文件到本地文件,并保存路径到数据库
- DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
- Calendar calendar = Calendar.getInstance();
- String fileName = df.format(calendar.getTime()) + files[i].getOriginalFilename();
- log.log("文件的文件名为:" + fileName);
- //保存文件的绝对路径
- String filePath = request.getSession().getServletContext().getRealPath("static/");
- log.log("文件的绝对路径:" + filePath);
- FileManage fileManage = new FileManage();
- try {
- //上传文件
- FileUtil.uploadFile(files[i].getBytes(), filePath, fileName);
- //保存到数据库代码,存入路径以及文件名称
- } catch (IllegalStateException | IOException e) {
- e.printStackTrace();
- throw new ZDYException(ErrorCode.ERR_FILE_UPLOAD_FAIL);
- }
- }
- }
文件上传工具类
- /**
- * Created by hengyang4 on 2018/11/2.
- */
- public class FileUtil {
- //文件上传工具类服务方法
- public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception{
- File targetFile = new File(filePath);
- if(!targetFile.exists()){
- targetFile.mkdirs();
- }
- FileOutputStream out = new FileOutputStream(filePath+fileName);
- out.write(file);
- out.flush();
- out.close();
- }
- }
二. 文件下载
- /**
- * 文件下载service
- * @param fileId
- * @throws Exception
- */
- @Override
- public String downloadFile(String fileId, HttpServletResponse response) throws Exception {
- //这里要根据文件id在数据库中查询之前保存的文件信息 FileManage fileManage = fileManageMapper.selectByPrimaryKey(fileId);
- //文件名
- String fileName = fileManage.getFileName();
- //文件的相对路径
- String path = fileManage.getFilePath();
- InputStream inputStream = new FileInputStream(new File(path + fileName));
- //如果文件不存在
- if(inputStream == null){
- throw new ZDYException(ErrorCode.ERR_NOT_FILE);
- }
- response.setHeader("content-type", "application/octet-stream");
- response.setContentType("application/octet-stream");
- try {
- String name = java.net.URLEncoder.encode(fileName, "UTF-8");
- response.setHeader("Content-Disposition", "attachment;filename=" + name );
- } catch (UnsupportedEncodingException e2) {
- e2.printStackTrace();
- }
- byte[] buff = new byte[1024];
- BufferedInputStream bis = null;
- OutputStream os = null;
- try {
- os = response.getOutputStream();
- bis = new BufferedInputStream(inputStream);
- int i = bis.read(buff);
- while (i != -1) {
- os.write(buff, 0, buff.length);
- os.flush();
- i = bis.read(buff);
- }
- } catch (FileNotFoundException e1) {
- //e1.getMessage()+"系统找不到指定的文件";
- throw new ZDYException(ErrorCode.ERR_NOT_FILE);
- }catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (bis != null) {
- try {
- bis.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return "success";
- }
这就是springboot中文件的上传和下载,很简单很快捷
Springboot(九).多文件上传下载文件(并将url存入数据库表中)的更多相关文章
- springboot整合vue实现上传下载文件
https://blog.csdn.net/yhhyhhyhhyhh/article/details/89888953 文章目录 springboot整合vue实现上传下载文件 1上传下载文件api文 ...
- 每天一个linux命令(文件上传下载文件操作):【转载】gzip命令
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以用 ...
- SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)
SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...
- Spring Boot2(十四):单文件上传/下载,文件批量上传
文件上传和下载在项目中经常用到,这里主要学习SpringBoot完成单个文件上传/下载,批量文件上传的场景应用.结合mysql数据库.jpa数据层操作.thymeleaf页面模板. 一.准备 添加ma ...
- 使用Typescript重构axios(二十五)——文件上传下载进度监控
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- SpringMVC文件上传下载(单文件、多文件)
前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...
- 一、手把手教你docker搭建fastDFS文件上传下载服务器
在搭建fastDFS文件上传下载服务器之前,你需要准备的有一个可连接的linux服务器,并且该linux服务器上已经安装了docker,若还有没安装docker的,先百度自行安装docker. 1.执 ...
- SpringMVC入门一:基础知识(依赖、注解、文件上传/下载、拦截器、异常处理等)
为了使Spring可插入MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作 ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
随机推荐
- 设计模式:解释器模式(Interpreter)
为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...
- pycharm 更换源 Windows Linux平台
pycharm 更换源 Windows Linux平台 参考资料:https://blog.csdn.net/wls666/article/details/95456309 Windows下更新源 文 ...
- 简单了解运用Git
Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制系统. SVN是集中式的. Git没有中央服务器,每台电脑就是一个完整的版本库 ,工作无需 ...
- Mac 安装 Homebrew
为什么要在 MAC 上安装 Homebrew 它干什么用的呢?我们知道在 CentOS 和 Ubuntu 上都有自己的包管理工具,但是在 MAC 上却没有这样类似的管理工具. # CentOS $ y ...
- 分布式锁的几种实现方法:redis实现分布式锁
使用失效的方式实现分布式锁(推荐) import redis.clients.jedis.Jedis; /** * 使用redis实现分布式锁(推荐) * */ public class JedLoc ...
- reduce方法的封装使用
reduce()方法 语法: arr.reduce( function(previousValue, item, index, arr) { }, initialValue) previousValu ...
- 改变font-weight的数值,样式并不会改变的原因
通常情况下,一个特定的字体仅会包含少数的可用字重.若所指定的字重不存在直接匹配,则会通过字体匹配算法规则匹配使用邻近的可用字重.这也就是为什么我们有时候使用特定字重时没有“生效”,看起来跟其它字重差不 ...
- NLP 基于kashgari和BERT实现中文命名实体识别(NER)
准备工作,先准备 python 环境,下载 BERT 语言模型 Python 3.6 环境 需要安装kashgari Backend pypi version desc TensorFlow 2.x ...
- zabbix磁盘的自动发现与磁盘指标监控
由于最近项目上需要对服务器监控进行规范化监控,再磁盘这块有几种方式 1.如果每台设备的磁盘是一样的 比如都有vda,vdb两块磁盘那么可以采用 1.1 每台客户端写脚本,服务端每台设备去加上监控项(- ...
- php+ajax远程加载避免重复提交
近日在练习签到送积分功能时,发现可以在一瞬间的时候提交好多次 导致可以重复领取多次积分 除了增加请求限制之外 发现ajax提交没有限制重复提交 遂立此贴为警示 首先上表单代码 <form ons ...