热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

springboot实现文件上传和下载功能

这篇文章主要为大家详细介绍了springboot实现文件上传和下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心。大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码。

1.文件上传(前端页面):

 表单提交加上enctype="multipart/form-data"很重要,文件以二进制流的形式传输。

2.文件上传(后端java代码)支持多文件

Way1.使用MultipartHttpServletRequest来处理上传请求,然后将接收到的文件以流的形式写入到服务器文件中:

@RequestMapping(value="/testUpload",method=RequestMethod.POST) 
 public void testUploadFile(HttpServletRequest req,MultipartHttpServletRequest multiReq) throws IOException{ 
 FileOutputStream fos=new FileOutputStream(new File("F://test//src//file//upload.jpg")); 
 FileInputStream fs=(FileInputStream) multiReq.getFile("file").getInputStream(); 
 byte[] buffer=new byte[1024]; 
 int len=0; 
 while((len=fs.read(buffer))!=-1){ 
  fos.write(buffer, 0, len); 
 } 
 fos.close(); 
 fs.close(); 
 } 

Way2.也可以这样来取得上传的file流:

// 文件上传
 @RequestMapping("/fileUpload")
 public Map fileUpload(@RequestParam("file") MultipartFile file, HttpServletRequest req) {
 Map result = new HashMap();
 SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");// 设置日期格式
 String dateDir = df.format(new Date());// new Date()为获取当前系统时间
 String serviceName = UuidUtil.get32UUID()
  + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
 File tempFile = new File(fileDir + dateDir + File.separator + serviceName);
 if (!tempFile.getParentFile().exists()) {
  tempFile.getParentFile().mkdirs();
 }
 if (!file.isEmpty()) {
  try {
  BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile));
  // "d:/"+file.getOriginalFilename() 指定目录
  out.write(file.getBytes());
  out.flush();
  out.close();
  } catch (FileNotFoundException e) {
  e.printStackTrace();
  result.put("msg", "上传失败," + e.getMessage());
  result.put("state", false);
  return result;
  } catch (IOException e) {
  e.printStackTrace();
  result.put("msg", "上传失败," + e.getMessage());
  result.put("state", false);
  return result;
  }
  result.put("msg", "上传成功");
  String fileId = Get8uuid.generateShortUuid();
  String fileName = file.getOriginalFilename();
  String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
  String fileUrl = webDir + dateDir + '/' + serviceName;
  uploadMapper.saveFileInfo(fileId, serviceName, fileType, fileUrl);
  result.put("state", true);
  return result;
 } else {
  result.put("msg", "上传失败,因为文件是空的");
  result.put("state", false);
  return result;
 }

3.application.properties配置文件

#上传文件大小设置
multipart.maxFileSize=500Mb
multipart.maxRequestSize=500Mb

4.文件下载将文件写到输出流里:

@RequestMapping(value="/testDownload",method=RequestMethod.GET) 
public void testDownload(HttpServletResponse res) throws IOException{ 
 File file = new File("C:/test.txt");
  resp.setHeader("content-type", "application/octet-stream");
  resp.setContentType("application/octet-stream");
  resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
  byte[] buff = new byte[1024];
  BufferedInputStream bis = null;
  OutputStream os = null;
  try {
  os = resp.getOutputStream();
  bis = new BufferedInputStream(new FileInputStream(file));
  int i = bis.read(buff);
  while (i != -1) {
  os.write(buff, 0, buff.length);
  os.flush();
  i = bis.read(buff);
  }
  } catch (IOException e) {
  e.printStackTrace();
  } finally {
  if (bis != null) {
  try {
  bis.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
 }

} 

5.获取文件大小

// 文件大小转换
DecimalFormat df1 = new DecimalFormat("0.00");
String fileSizeString = "";
long fileSize = file.getSize();
if (fileSize <1024) {
 fileSizeString = df1.format((double) fileSize) + "B";
 } else if (fileSize <1048576) {
 fileSizeString = df1.format((double) fileSize / 1024) + "K";
 } else if (fileSize <1073741824) {
 fileSizeString = df1.format((double) fileSize / 1048576) + "M";
 } else {
 fileSizeString = df1.format((double) fileSize / 1073741824) + "G";
 }

如果是File类则fileSize=file.length()。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Git版本控制基础解析
    本文探讨了Git作为版本控制工具的基本概念及其重要性,不仅限于代码管理,还包括文件的历史记录与版本切换功能。通过对比Git与SVN,进一步阐述了分布式版本控制系统的独特优势。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 利用Docker部署JupyterHub以支持Python协同开发
    本文介绍了如何通过Docker容器化技术安装和配置JupyterHub,以实现多用户的Python开发环境,特别适合团队协作场景。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 探索OpenWrt中的LuCI框架
    本文深入探讨了OpenWrt系统中轻量级HTTP服务器uhttpd的工作原理及其配置,重点介绍了LuCI界面的实现机制。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • LoadRunner中的IP欺骗配置与实践
    为了确保服务器能够有效地区分不同的用户请求,避免多人使用同一IP地址造成的访问限制,可以通过配置IP欺骗来解决这一问题。本文将详细介绍IP欺骗的工作原理及其在LoadRunner中的具体配置步骤。 ... [详细]
  • 正则表达式入门指南
    本文基于《正则表达式必知必会》(作者:Ben Forta,译者:杨涛),介绍了正则表达式的基本概念及其应用,包括搜索与替换功能,以及元字符的分类与使用。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • PHP 图形函数中实现汉字显示的方法
    本文详细介绍了如何在 PHP 的图形函数中正确显示汉字,包括具体的步骤和注意事项,适合初学者和有一定基础的开发者阅读。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
author-avatar
妈妈说称号长的人很牛也
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有