本文实例为大家分享了Axios Spring Boot实现文件上传和下载的具体代码,供大家参考,具体内容如下

1.所用技术

前端:Vue Axios

后端:Springboot SpringMVC

2.单文件上传

后端代码

只需要使用MultipartFile类配合RequestBody注解即可

@PostMapping("your/path")
public ResultData courseCoverUpload(@RequestBody MultipartFile file){
    /**
    your service
    */
}

前端代码

Axios上传需要设置头部,使用FormData封装文件对象

//file为文件对象
function upload(file){
    //请求头设置
    const header={"Content-type":"multipart/form-data"}
    let formData=new FormData();
    //用file作为key没问题,其他没试过
    formData.append("file",file);
       //这里request封装过,也可以直接使用axios.post()
    request.post(`path`,formData,{headers:header}).then(res=>{
        //your serivce
    })
}

如若使用element-ui的upload组件,可以选择自定义上传方法(好处是可以再请求头中加入token)

<el-upload
      class="upload-demo"
      :auto-upload="false"
      action
      :http-request="uploadFile"
      ref="upload"
      >
          <el-button type="text">点击上传</el-button>
</el-upload>

上述uploadFile正是上传时的回调函数,使用方法如下

function uploadFile(param){
    //param中的file才是真正的文件体,用于传入axios上传方法的参数
    upload( param.file )
},

3.文件上传的同时传输Json数据

后端代码

将@RequestBody换成==@RequestPart==注解,并再注解中加入接收时的识别key即可同时接受文件和其他Json参数

@PostMapping("up")
public ResultData uploadTest(
    @RequestPart("file") MultipartFile file, 
    @RequestPart("other") Map<String,String> props
    ){
    return ResultData.success().data("file_size",file.getSize()).data("others",props);
}

前端代码

function  uploadFile(file_body,other_json){

    //头信息不变
    const header={"Content-type":"multipart/form-data"}
    //依旧用FormData作数据封装
    let form_data=new FormData();
    //此处的key要与后端统一,这里都使用file
    form_data.append("file",file_body)
    //再封装其他参数时需要使用Blob,[]不要错,type一定要加
    form_data.append( "other",new Blob([JSON.stringify(other_json)],{type:"application/json"}))
    //这里request封装过,也可以直接使用axios.post()
    request.post(url,form_data,{headers: header}).then(rs=>{
      console.log(rs);
    })
}

4.文件下载

使用axios下载文件最恶心之处就在于前后端请求头还有解析格式要匹配,否则就会出现跨域或者文件流出错等问题。

后端代码

和返回json数据不同,返回文件流需要使用HttpServletResponse类的输出流将文件流逐一打印出去,这里选择用过滤器处理请求,也可以使用Controller

编写接收前端请求的过滤器

public class FileFilter implements Filter , InputOutputUtil {
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        /** 本次后端默认前端使用Get请求进行下载,如若get需要传递参数可以用getParameter方式获取
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            System.out.println(request.getParameter("a"));
        */
        //获取文件输出流,这里是读取本地的
        File  f= new File("file_path");
        InputStream inpurStream = new FileInputStream(file);
        /** 如果文件资源在其他服务器上(比如阿里云的OSS),可以用以下代码获取文件流
        URLConnection urlConn = new URL("URL_PATH").openConnection();
        urlConn.connect();
        InputStream inputStream = urlConn.getInputStream();
        */
        
        //输出方法,放在了自己编写的InputOutputUtil中
        this.writeFile(servletResponse,"security_key.jpg",inputStream);
    }
}

辅助输出的接口

public interface InputOutputUtil {
    //输出文件时用
    default void writeFile(ServletResponse servletResponse,
                           String fileName,InputStream inputStream) throws IOException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //设置返回的头信息
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("UTF-8");
        response.addHeader("Content-disposition", "attachment;filename=\"" fileName "\"");
        
        //跨域处理
        response.setHeader("Access-Control-Expose-Headers","Content-Disposition");
        response.setHeader("Access-Control-Allow-Origin","*");
        response.setHeader("Access-Control-Allow-Methods","GET,POST,PUT,DELETE");
        response.setHeader("Access-Control-Allow-Headers","*");
        response.setHeader("Access-Control-Max-Age","false");
        response.setHeader("Access-Control-Allow-Credentials","10");
        
        //获取输出流
        ServletOutputStream outputStream=response.getOutputStream();
        //将文件流逐一放入输出流中打印给前端
        byte[] bs1=new byte[1024];
        int length;
        while((length=inputStream.read(bs1))!=-1){
            outputStream.write(bs1,0,length);
        }
        //关流操作
        outputStream.close();
        inputStream.close();
    }
}

前端代码

使用axios的get方法发起请求

function downloadFile(url,param=null){
    //设置头信息
    let config = {responseType:'blob'}
    //如若前端有参数就加入一下
    if (param!=null) config["params"]=param
    //带着头信息和请求参数发起请求
    request.get(url,config).then(res=>{
        //如若成功了,开始拆箱
        //获取filename,这里使用的是正则表达式,关联 辅助输出接口 的第9行
        let file_name=res.headers["content-disposition"].match(/filename=\"(\S*)\"/)[1]
        //data中装的是文件体,需要使用Blob流可以下载
        let blob = new Blob([res.data])
        
        //网上最常用的下载方法
        let downloadElement = document.createElement('a')
        let href = window.URL.createObjectURL(blob); //创建下载的链接
        downloadElement.href = href;
        downloadElement.download = file_name; //下载后文件名
        document.body.appendChild(downloadElement);
        downloadElement.click(); //点击下载
        document.body.removeChild(downloadElement); //下载完成移除元素
        window.URL.revokeObjectURL(href); //释放blob对象
    })
}

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

Axios+Spring Boot实现文件上传和下载的更多相关文章

  1. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  2. PHP实现文件安全下载

    例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用"Redirect"的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。feof){echofread;}fclose;}这样就可以用PHP直接输出文件了。

  3. 解决axios:"timeout of 5000ms exceeded"超时的问题

    这篇文章主要介绍了解决axios:"timeout of 5000ms exceeded"超时的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  4. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  5. PHP实现文件上传与下载实例与总结

    这篇文章主要介绍了PHP实现文件上传与下载实例与总结的相关资料,需要的朋友可以参考下

  6. 小程序实现图片裁剪上传

    这篇文章主要为大家详细介绍了小程序实现图片裁剪上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. js实现头像上传并且可预览提交

    这篇文章主要介绍了js如何实现头像上传并且可预览提交,帮助大家更好的理解和使用js,感兴趣的朋友可以了解下

  8. SpringBoot本地磁盘映射问题

    这篇文章主要介绍了SpringBoot本地磁盘映射问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源)

    这篇文章主要介绍了java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源),文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

  10. SpringBoot整合Javamail实现邮件发送的详细过程

    日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等,下面这篇文章主要给大家介绍了关于SpringBoot整合Javamail实现邮件发送的详细过程,需要的朋友可以参考下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部