一.   文件上传

这里我们使用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:

  1. /**
  2. * 多文件上传接口
  3. * */
  4. @ResponseBody
  5. @RequestMapping(value = "/fileUpload", produces = "application/json;charset=UTF-8")
  6. public JSONObject fileUpload(@RequestParam("file") MultipartFile[] files, HttpServletRequest request) throws Exception{
  7. String serverName = "文件上传";
  8. VirgoLog.updateStep(CONTROLLER_NAME_DES,serverName);
  9. List<FileManage> fileManages = fileService.fileUpload(files,request);
  10. Map<String,Object> resMap = new HashMap<String,Object>();
  11. //0:操作成功
  12. resMap.put("code", ErrorCode.ERR_SUCCEED.getErrorCode());
  13. resMap.put("desc",ErrorCode.ERR_SUCCEED.getErrorMessage());
  14. resMap.put("fileInfo",fileManages);
  15. return JSON.parseObject(JSONConvertor.toJSON(resMap));
  16. }

service  文件上传业务类

  1. /**
  2. * 文件上传service
  3. * @param files
  4. * @throws Exception
  5. */
  6. @Override
  7. public void fileUpload(@RequestParam("file")MultipartFile[] files, HttpServletRequest request) throws Exception {
  8. //文件命名
  9. //保存时的文件名
  10. for(int i=0;i<files.length;i++) {
  11. //保存文件到本地文件,并保存路径到数据库
  12. DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
  13. Calendar calendar = Calendar.getInstance();
  14. String fileName = df.format(calendar.getTime()) + files[i].getOriginalFilename();
  15. log.log("文件的文件名为:" + fileName);
  16. //保存文件的绝对路径
  17. String filePath = request.getSession().getServletContext().getRealPath("static/");
  18. log.log("文件的绝对路径:" + filePath);
  19. FileManage fileManage = new FileManage();
  20. try {
  21. //上传文件
  22. FileUtil.uploadFile(files[i].getBytes(), filePath, fileName);
  23. //保存到数据库代码,存入路径以及文件名称
  24. } catch (IllegalStateException | IOException e) {
  25. e.printStackTrace();
  26. throw new ZDYException(ErrorCode.ERR_FILE_UPLOAD_FAIL);
  27. }
  28. }
  29. }

  

文件上传工具类

  1. /**
  2. * Created by hengyang4 on 2018/11/2.
  3. */
  4. public class FileUtil {
  5.  
  6. //文件上传工具类服务方法
  7. public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception{
  8.  
  9. File targetFile = new File(filePath);
  10. if(!targetFile.exists()){
  11. targetFile.mkdirs();
  12. }
  13. FileOutputStream out = new FileOutputStream(filePath+fileName);
  14. out.write(file);
  15. out.flush();
  16. out.close();
  17. }
  18.  
  19. }

二.    文件下载

  1. /**
  2. * 文件下载service
  3. * @param fileId
  4. * @throws Exception
  5. */
  6. @Override
  7. public String downloadFile(String fileId, HttpServletResponse response) throws Exception {
  8. //这里要根据文件id在数据库中查询之前保存的文件信息 FileManage fileManage = fileManageMapper.selectByPrimaryKey(fileId);
  9. //文件名
  10. String fileName = fileManage.getFileName();
  11. //文件的相对路径
  12. String path = fileManage.getFilePath();
  13. InputStream inputStream = new FileInputStream(new File(path + fileName));
  14. //如果文件不存在
  15. if(inputStream == null){
  16. throw new ZDYException(ErrorCode.ERR_NOT_FILE);
  17. }
  18. response.setHeader("content-type", "application/octet-stream");
  19. response.setContentType("application/octet-stream");
  20. try {
  21. String name = java.net.URLEncoder.encode(fileName, "UTF-8");
  22. response.setHeader("Content-Disposition", "attachment;filename=" + name );
  23. } catch (UnsupportedEncodingException e2) {
  24. e2.printStackTrace();
  25. }
  26. byte[] buff = new byte[1024];
  27. BufferedInputStream bis = null;
  28. OutputStream os = null;
  29. try {
  30. os = response.getOutputStream();
  31. bis = new BufferedInputStream(inputStream);
  32. int i = bis.read(buff);
  33. while (i != -1) {
  34. os.write(buff, 0, buff.length);
  35. os.flush();
  36. i = bis.read(buff);
  37. }
  38. } catch (FileNotFoundException e1) {
  39. //e1.getMessage()+"系统找不到指定的文件";
  40. throw new ZDYException(ErrorCode.ERR_NOT_FILE);
  41. }catch (IOException e) {
  42. e.printStackTrace();
  43. } finally {
  44. if (bis != null) {
  45. try {
  46. bis.close();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. return "success";
  53.  
  54. }

  这就是springboot中文件的上传和下载,很简单很快捷

Springboot(九).多文件上传下载文件(并将url存入数据库表中)的更多相关文章

  1. springboot整合vue实现上传下载文件

    https://blog.csdn.net/yhhyhhyhhyhh/article/details/89888953 文章目录 springboot整合vue实现上传下载文件 1上传下载文件api文 ...

  2. 每天一个linux命令(文件上传下载文件操作):【转载】gzip命令

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以用 ...

  3. SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)

    SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...

  4. Spring Boot2(十四):单文件上传/下载,文件批量上传

    文件上传和下载在项目中经常用到,这里主要学习SpringBoot完成单个文件上传/下载,批量文件上传的场景应用.结合mysql数据库.jpa数据层操作.thymeleaf页面模板. 一.准备 添加ma ...

  5. 使用Typescript重构axios(二十五)——文件上传下载进度监控

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. SpringMVC文件上传下载(单文件、多文件)

    前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...

  7. 一、手把手教你docker搭建fastDFS文件上传下载服务器

    在搭建fastDFS文件上传下载服务器之前,你需要准备的有一个可连接的linux服务器,并且该linux服务器上已经安装了docker,若还有没安装docker的,先百度自行安装docker. 1.执 ...

  8. SpringMVC入门一:基础知识(依赖、注解、文件上传/下载、拦截器、异常处理等)

    为了使Spring可插入MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作 ...

  9. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

随机推荐

  1. 设计模式:解释器模式(Interpreter)

    为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...

  2. pycharm 更换源 Windows Linux平台

    pycharm 更换源 Windows Linux平台 参考资料:https://blog.csdn.net/wls666/article/details/95456309 Windows下更新源 文 ...

  3. 简单了解运用Git

    Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制系统. SVN是集中式的. Git没有中央服务器,每台电脑就是一个完整的版本库 ,工作无需 ...

  4. Mac 安装 Homebrew

    为什么要在 MAC 上安装 Homebrew 它干什么用的呢?我们知道在 CentOS 和 Ubuntu 上都有自己的包管理工具,但是在 MAC 上却没有这样类似的管理工具. # CentOS $ y ...

  5. 分布式锁的几种实现方法:redis实现分布式锁

    使用失效的方式实现分布式锁(推荐) import redis.clients.jedis.Jedis; /** * 使用redis实现分布式锁(推荐) * */ public class JedLoc ...

  6. reduce方法的封装使用

    reduce()方法 语法: arr.reduce( function(previousValue, item, index, arr) { }, initialValue) previousValu ...

  7. 改变font-weight的数值,样式并不会改变的原因

    通常情况下,一个特定的字体仅会包含少数的可用字重.若所指定的字重不存在直接匹配,则会通过字体匹配算法规则匹配使用邻近的可用字重.这也就是为什么我们有时候使用特定字重时没有“生效”,看起来跟其它字重差不 ...

  8. NLP 基于kashgari和BERT实现中文命名实体识别(NER)

    准备工作,先准备 python 环境,下载 BERT 语言模型 Python 3.6 环境 需要安装kashgari Backend pypi version desc TensorFlow 2.x ...

  9. zabbix磁盘的自动发现与磁盘指标监控

    由于最近项目上需要对服务器监控进行规范化监控,再磁盘这块有几种方式 1.如果每台设备的磁盘是一样的 比如都有vda,vdb两块磁盘那么可以采用 1.1 每台客户端写脚本,服务端每台设备去加上监控项(- ...

  10. php+ajax远程加载避免重复提交

    近日在练习签到送积分功能时,发现可以在一瞬间的时候提交好多次 导致可以重复领取多次积分 除了增加请求限制之外 发现ajax提交没有限制重复提交 遂立此贴为警示 首先上表单代码 <form ons ...