`

文章目录

  • 前言
  • 一、前端上传文件,Springboot接受并保存在某个路径
    • 1.引入库
    • 2.前端核心代码(发送文件)
    • 3.Controller类
    • 4.注意事项
  • 二、Springboot发送文件,前端接收并下载。
    • 1.引入库
    • 2.前端核心代码(发送文件)
    • 3.Controller类
    • 4.注意事项

前言

前后端涉及到文件的传输,都是以二进制流的形式进行交互的。


一、前端上传文件,Springboot接受并保存在某个路径

示例:springboot内部封装了MultipartFile接口,用于接收和处理前端发送过来的文件。

1.引入库

代码如下(示例):

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

2.前端核心代码(发送文件)

代码如下(示例):

<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="multipartfile" accept="image/png" value="请选择文件"><input type="submit" value="上传">
</form>

action属性指定了uoload接口。发送文件的请求方式method必须是post,因为需要http请求报文的数据体封装文件数据。
编码方式enctype必须是“multipart/form-data”,指表单数据中由多部分构成,既有文本数据,又有文件等二进制数据。默认情况下,enctype的值是“application/x-www-form-urlencoded”,不能用于文件上传,只有使用了“multipart/form-data”,才能完整的传递文件数据。“application/x-www-form-urlencoded”不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。accept属性是用来指定文件类型的,属性值"image/png"表示只能上传.png图片的文件。


3.Controller类

代码如下(示例):

@RestController
public class uploadcontroller {SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");@PostMapping("/upload")public String upload(MultipartFile multipartfile, HttpServletRequest request){String realPath = request.getSession().getServletContext().getRealPath("/update/");String format=sdf.format(new Date());File folder=new File(realPath+format);if(!folder.isDirectory()){folder.mkdirs();}String oldname = multipartfile.getOriginalFilename();String newname = UUID.randomUUID().toString()+oldname.substring(oldname.lastIndexOf("."),oldname.length());try {multipartfile.transferTo(new File(folder, newname));System.out.println(new File(folder, newname).getAbsolutePath());//输出(上传文件)保存的绝对路径String filePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/update/"+format+newname;return filePath+"上传成功";}catch (IOException e){e.printStackTrace();}return "上传失败!";}
}

multipartfile封装了接受到的文件,multipartfile.getOriginalFilename()获取上传文件的完整名称,包括文件名和文件扩展名(如.png,.txt等指定文件类型的后缀);multipartfile.transferTo(new File(folder, newname))将接受文件下载到new File(folder, newname)对象指定的路径下。
request封装了http请求对象。request.getSession()获取一个http请求的session(会话);getServletContext()获取一个http请求对应的web应用上下文;getRealPath(“/update/”)获取一个相对(web应用上下文)地址为“/update/”的绝对地址。


4.注意事项

处理前端post请求的接口必须要用 @PostMapping注解,否则post请求无法访问成功!!!!


二、Springboot发送文件,前端接收并下载。

示例:MIME(Multipurpose Internet Mail Extensions)是一种多用途互联网邮件扩展。但不局限于邮件,适用于所有的浏览器能接受的文件。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
Springboot可通过(HttpServletResponse对象)response.setContentType(contenttype)设置发送到浏览器(前端)的响应内容的类型。
给浏览器(前端)的文件必须是以二进制流的形式发送的(在Java中要用io流对发送文件进行处理,以字节数组(byte[])的形式发送),因为只有以二进制的形式,才能处理文件中多类型的数据。

1.引入库

代码如下(示例):

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.IOException;

2.前端核心代码(发送文件)

代码如下(示例):

<a href="/load" download="file">下载文件</a>

href属性设置请求接口为"/load",download表明这是一个请求下载的链接,且下载到的文件会被自动改名为"file"。这种请求方式是get形式。


3.Controller类

代码如下(示例):

@RestController
public class loadcontroller {@GetMapping("/load")public void fileload( HttpServletResponse response) throws IOException {File f = new File("C:\\Users\\Java\\Desktop\\新建 文本文档.txt");FileInputStream ips = new FileInputStream(f);OutputStream ops = response.getOutputStream();response.setContentType("application/octet-stream; charset=UTF-8");byte[] a = new byte[1000];ips.read(a);ops.write(a);}
}
//本代码在执行结束后并没有手动关闭对应的io流,读者可自行解决

通过response.getOutputStream()得到ServletOutputStream接口,ServletOutputStream是OutputStream的子接口。(HttpServletResponse)response的输出流对应的是http响应内容,通过response输出流的write方法就可以给http响应报文的数据体内写内容了,从而发送给对应的浏览器。
response.setContentType(“application/octet-stream; charset=UTF-8”)设置响应内容的类型为二进制流(application/octet-stream),字符编码方式为UTF-8。


4.注意事项

凡是以一个UIR链接进行后端接口访问的请求方式都是get方式,对应的接口必须用 @GetMapping进行注解,表明该接口可以接受get请求。
凡是返回数据的Controller类都应该用@RestController标注,@Controller标注的Controller类是返回视图的。

Springboot接受文件与发送文件相关推荐

  1. Ajax 发送json格式数据以及发送文件(FormData)和自带的序列化组件: serializers

    前后端传输数据的编码格式(contentType) get请求数据就是直接放在url?后面的 url?usernmae=junjie&password=123... 可以向后端发送post请求 ...

  2. 串口 YModem 协议 发送文件

    开发环境:         VS2005 .netframework 2.0 语言:         C# 运行平台:          windows CE 5.0 背景:         这几天在 ...

  3. C#网络编程:4订立协议和发送文件

    前面两篇文章所使用的范例都是传输字符串,有的时候我们可能会想在服务端和客户端之间传递文件.比如,考虑这样一种情况,假如客户端显示了一个菜单,当我们输入S1.S2或S3(S为Send缩写)时,分别向服务 ...

  4. (转)C#网络编程(订立协议和发送文件) - Part.4

    源码下载:http://www.tracefact.net/SourceCode/Network-Part4.rar C#网络编程(订立协议和发送文件) - Part.4 文件传输 前面两篇文章所使用 ...

  5. C#网络编程(订立协议和发送文件) - Part.4

    转载自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part4.aspx 文件传输 前面两篇文章所使用的范例都是传输 ...

  6. 文档发送到淘宝旺旺服务器,阿里旺旺文件发送_使用阿里旺旺如何发送文件_飞翔教程...

    有三种方法可以将本地的文件发送给对方联系人: 方法一: 1.在和联系人的聊天窗口中,点击工具栏中的"文件"按钮,从本地计算机中选择需要发送的文件,点击"打开"按 ...

  7. 企业微信如何简单实现定时发送文件到群:企业微信群机器人操作(Java代码实现)

    前言 不知道小伙伴们的公司组织架构通勤用的啥软件,我公司用的企业微信.然后业务销售部那边需要每天统计销售数据报表然后发在群里(我是开发,我不配在群里).知道这个背景以后,产品给我们的需求是:直接统计数 ...

  8. centos下ftp接受/发送文件

    2019独角兽企业重金招聘Python工程师标准>>> 1.安装ftp [root@10.90.3.118 ~]# yum install ftp -y 2.连接FTP服务器 [ro ...

  9. SpringBoot 接受文件和对象

    SpringBoot 接受文件和对象 使用场景:某个接口,需要同时接受文件和实体,也就是参数 文章目录 SpringBoot 接受文件和对象 使用场景:某个接口,需要同时接受文件和实体,也就是参数 一 ...

最新文章

  1. 【转】Python机器学习库
  2. SpringBoot 项目tomcat插件启动报错 java.lang.NoClassDefFoundError: javax/el/ELManager
  3. POJ3270 Cow Sorting ——置换群
  4. python画完图 程序暂停运行_[Python实战]你也能写的计时器程序
  5. 02-Wifi通讯架构介绍
  6. 前端学习(1849)vue之电商管理系统电商系统前端项目初始化
  7. C语言进阶深度学习目录表
  8. linux平台下使用boost库
  9. Java:线程并发工具类
  10. Vijos P1217 乒乓球【模拟+输入输出】
  11. makefile ------ subst、foreach、wildcard、notdir
  12. [LCS]LCS应用案例--SipSnoop概述。
  13. 逻辑回归(Logistic Regression)详解
  14. 接口测试如何生成随机的参数值
  15. git基础命令以及用法
  16. SAP系统常用配置参数设定
  17. 互联网巨头员工的跳槽去向与薪资涨幅
  18. 微信小程序 主题皮肤切换(switch开关)
  19. 绿盟漏扫系统漏洞及修复方案
  20. matlab仿真直流电机,[转载]基于Matlab/Simulink的无刷直流电机控制仿真研究

热门文章

  1. 网站优化与移动端手机网站优化的变向
  2. 最新通知!ComingChat V0.0.6版本上线!
  3. Vue.js中splice()方法实现对数组进行删除的操作
  4. python爬虫小测试
  5. java游戏打败boss有元素精灵_原神黄金屋boss用什么元素打
  6. org.apache.commons.lang3.StringUtils.isNotBlank和isEmpty方法
  7. android 热点被连接电脑,有病毒的android手机或电脑连了我的android手机的热点,我的android手机的热点又给了另外的苹果手机用,那我�...
  8. 【反侦测】几个安卓和iOS上的root/越狱反侦测工具
  9. HTML中怎样把文字分两栏显示,Word一栏与多栏文本的混排(同一页既有一栏又有两栏等等)...
  10. c语言调汇编程序比较字符串,用汇编语言实现两个字符串的输入并比较,输出不同字符的个数,要用MACRO比较...