Springboot接收文件与发送文件实例教程

 更新时间:2023年05月27日 11:06:54   作者:都是些老物件  
最近工作中遇到个需求,springboot简单的上传文档或者图片,并且进行操作,操作完后进行保存指定路径,下面这篇文章主要给大家介绍了关于Springboot接收文件与发送文件的相关资料,需要的朋友可以参考下

前言

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

一、前端上传文件,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" rel="external nofollow"  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接收文件与发送文件的文章就介绍到这了,更多相关Springboot接收文件与发送文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • java基于OpenGL ES实现渲染实例

    java基于OpenGL ES实现渲染实例

    这篇文章主要介绍了java基于OpenGL ES实现渲染,实例分析了OpenGL渲染操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • Spring依赖注入多种类型数据的示例代码

    Spring依赖注入多种类型数据的示例代码

    这篇文章主要介绍了Spring依赖注入多种类型数据,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java集合框架之Stack Queue Deque使用详解刨析

    Java集合框架之Stack Queue Deque使用详解刨析

    早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同
    2021-10-10
  • Java处理不可见特殊字符要点解析

    Java处理不可见特殊字符要点解析

    这篇文章主要介绍了Java处理不可见特殊字符要点解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • springboot如何重定向外部网页

    springboot如何重定向外部网页

    这篇文章主要介绍了springboot如何重定向外部网页,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java模拟QQ实现聊天互动程序

    Java模拟QQ实现聊天互动程序

    这篇文章主要介绍了如何利用Java语言模拟QQ实现一个简易的聊天互动程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • MySQL+SSM+Ajax上传图片问题

    MySQL+SSM+Ajax上传图片问题

    本文主要介绍了MySQL+SSM+Ajax上传图片问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • IDEA2020.1个性化设置的实现

    IDEA2020.1个性化设置的实现

    这篇文章主要介绍了IDEA2020.1个性化设置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Spring Cloud入门教程之Zuul实现API网关与请求过滤

    Spring Cloud入门教程之Zuul实现API网关与请求过滤

    这篇文章主要给大家介绍了关于Spring Cloud入门教程之Zuul实现API网关与请求过滤的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-05-05
  • java如何从不规则的字符串中截取出日期

    java如何从不规则的字符串中截取出日期

    这篇文章主要介绍了java从不规则的字符串中截取出日期的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论