位置: IT常识 - 正文

SpringBoot+Vue实现文件上传下载功能

编辑:rootadmin
SpringBoot+Vue实现文件上传下载功能 前言

推荐整理分享SpringBoot+Vue实现文件上传下载功能,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

本文主要实现了以下功能: 1、 单文件上传以及多文件上传功能 2、 输入文件名下载文件功能 3、 输入音频文件名在线播放音频功能

一、项目基础部分搭建1.1 前端项目搭建1.1.1 新建前端项目

打开命令行输入以下命令,使用Vue CLI创建前端项目,Vue CLI安装教程

vue create file-demo

1.1.2 引入axios

输入以下命令在项目中引入axios

npm install axios --save

1.1.3 解决跨域问题

打开vue.config.js添加以下配置,修改启动端口,以及配置代理解决跨域问题

const { defineConfig } = require('@vue/cli-service')module.exports = defineConfig({ transpileDependencies: true})module.exports = { devServer: { // 修改前端项目启动端口号 port: 8081, proxy: { '^/file': { // 此处配置对应的后端端口 target: "http://localhost:8080", // 如果是https接口,需要配置这个参数为true secure: false, // 此处配置路径重写 pathRewrite: { '^/file': '/file' } } } }}1.2 后端项目搭建1.2.1 新建后端项目SpringBoot+Vue实现文件上传下载功能

打开IDEA,按照以下步骤创建一个新的SpringBoot项目

1.2.2 编辑配置文件

打开项目,编辑application.properties配置文件,输入以下配置

#可以选择性的修改或选择以下配置#配置服务端口server.port=8080#是否开启文件上传支持,默认是truespring.servlet.multipart.enabled=true#文件写入磁盘的阈值,默认是0spring.servlet.multipart.file-size-threshold=0#单个文件的最大值,默认是50MBspring.servlet.multipart.max-file-size=50MB#多个文件上传时的总大小 值,默认是100MBspring.servlet.multipart.max-request-size=100MB#是否延迟解析,默认是falsespring.servlet.multipart.resolve-lazily=false#自定义文件访问路径myfile.path=E:\\test\\dir二、文件上传功能2.1 单文件上传功能实现2.1.1 前端代码

在App.vue中添加如下代码,使用form标签实现文件上传功能

<template> <p>单文件上传</p> <form action="/file/uploadSingleFile" method="post" enctype="multipart/form-data"> 文件: <input type="file" name="file"> <input type="submit"> </form></template>2.1.2 后端代码

在com.example.springbootdemo.controller包下创建UploadFileController.java文件

package com.example.springbootdemo.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;@Slf4j@RestController@RequestMapping("/file")public class UploadFileController { @Value("${myfile.path}") private String filePath; // 单文件上传功能 @PostMapping("/uploadSingleFile") public void uploadSingleFile(@RequestParam("file") MultipartFile multipartFile) { String fileName = multipartFile.getOriginalFilename(); File file = new File(filePath + '\\' + fileName); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); log.info("父级文件目录不存在,已创建目录"); } try { multipartFile.transferTo(file); } catch (IOException e) { log.error("{}",e); log.error("程序错误,请重新上传"); e.printStackTrace(); } finally { log.info("文件上传成功,文件全路径名称为:{}",file.getPath()); } }}2.2 多文件上传功能实现2.2.1 前端代码

在App.vue中添加如下代码,使用form标签实现文件上传功能

<template> <p>多文件上传</p> <form action="/file/uploadMultipleFile" method="post" enctype="multipart/form-data"> 文件: <input type="file" name="files" multiple="multiple"> <input type="submit"> </form></template>2.2.2 后端代码

在com.example.springbootdemo.controller包下创建UploadFileController.java文件

package com.example.springbootdemo.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;@Slf4j@RestController@RequestMapping("/file")public class UploadFileController { @Value("${myfile.path}") private String filePath; // 多文件上传功能实现 @PostMapping("/uploadMultipleFile") public void uploadMultipleFile(@RequestParam("files") MultipartFile multipartFiles[]) { for (MultipartFile multipartFile : multipartFiles) { String fileName = multipartFile.getOriginalFilename(); File file = new File(filePath + '\\' + fileName); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); log.info("父级文件目录不存在,已创建目录"); } try { multipartFile.transferTo(file); } catch (IOException e) { log.error("{}",e); log.error("程序错误,请重新上传"); e.printStackTrace(); } finally { log.info("文件上传成功,文件全路径名称为:{}",file.getPath()); } } }}三、文件下载功能3.1 普通文件下载功能实现3.1.1 前端代码

在App.vue中添加如下代码,使用form标签实现文件上传功能

<template> <p>文件下载{{inputData.fileName}}</p> <input type="text" placeholder="请输入全文件名" v-model="inputData.fileName"> <button @click="downloadFile">下载</button></template><script>import axios from 'axios';import { reactive } from 'vue';export default{ setup() { let inputData = reactive({ fileName:"" }) // 下载文件函数 async function downloadFile() { let BASE_URL = "/file"; let data = { ...inputData } console.log(inputData); await axios({ url: `${BASE_URL}/downloadFile`, method: "post" , data: data, headers: { 'Content-Type': 'application/json' }, responseType: 'blob', }).then((resp) => { const blob = new Blob([resp.data]); var downloadElement = document.createElement("a"); var href = window.URL.createObjectURL(blob); downloadElement.href = href; downloadElement.download = decodeURIComponent(inputData.fileName); document.body.appendChild(downloadElement); downloadElement.click(); document.body.removeChild(downloadElement); window.URL.revokeObjectURL(href); }); } return { inputData, downloadFile } }}</script>3.1.2 后端代码

在com.example.springbootdemo.controller包下建立DownloadFileController

package com.example.springbootdemo.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.util.Map;@Slf4j@RestController@RequestMapping("/file")public class DownloadFileController { @Value("${myfile.path}") private String filePath; @PostMapping("/downloadFile") public void downloadFile(@RequestBody Map<String, String> params, HttpServletRequest request, HttpServletResponse response) { log.info("文件名为:{}",params.get("fileName")); if (!params.containsKey("fileName") || params.get("fileName") == null || "".equals(params.get("fileName"))) { log.info("文件名不存在"); return; } if (filePath == null || "".equals(filePath)) { log.info("文件路径不存在"); return; } String fileName = params.get("fileName"); String fullPath = filePath + "\\" + fileName; try { download(request,response, fullPath, fileName); } catch (Exception e) { log.error("{}",e); log.error("文件下载失败"); e.printStackTrace(); } } // 下载文件方法: public static void download(HttpServletRequest request, HttpServletResponse response, String filePath, String realName) throws Exception { response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("UTF-8"); BufferedInputStream bis = null; BufferedOutputStream bos = null; long fileLength = (new File(filePath)).length(); response.setContentType("application/octet-stream;charset=GBK"); response.setHeader("Content-disposition", "attachment; filename=" + new String(realName.getBytes("GB2312"), "ISO-8859-1")); response.setHeader("Content-Length", String.valueOf(fileLength)); bis = new BufferedInputStream(new FileInputStream(filePath)); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } bis.close(); bos.close(); }}3.2 音频文件在线播放功能实现3.2.1 前端代码

在App.vue中添加如下代码,使用form标签实现文件上传功能

<template> <p>文件下载{{inputData.fileName}}</p> <input type="text" placeholder="请输入全文件名" v-model="inputData.fileName"> <button @click="downloadFile">下载</button> <p>音乐在线播放{{}}</p> <input type="text" placeholder="请输入音乐文件名" v-model="inputData.fileName"> <button @click="playMusic">播放音乐</button> <br> <audio controls currentTime autoplay :src='audioSrc.data'></audio></template><script>import axios from 'axios';import { reactive } from 'vue';export default{ setup() { let inputData = reactive({ fileName:"" }) let audioSrc = reactive({ data:"" }); // 在线播放音乐函数 async function playMusic() { let BASE_URL = "/file"; let data = { ...inputData } console.log(inputData); await axios({ url: `${BASE_URL}/downloadFile`, method: "post" , data: data, headers: { 'Content-Type': 'application/json' }, responseType: 'blob', }).then((Blobdata) => { audioSrc.data = window.URL.createObjectURL(Blobdata.data); }); } return { inputData, audioSrc, playMusic } }}</script>3.2.2 后端代码

在com.example.springbootdemo.controller包下建立DownloadFileController

package com.example.springbootdemo.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.util.Map;@Slf4j@RestController@RequestMapping("/file")public class DownloadFileController { @Value("${myfile.path}") private String filePath; @PostMapping("/downloadFile") public void downloadFile(@RequestBody Map<String, String> params, HttpServletRequest request, HttpServletResponse response) { log.info("文件名为:{}",params.get("fileName")); if (!params.containsKey("fileName") || params.get("fileName") == null || "".equals(params.get("fileName"))) { log.info("文件名不存在"); return; } if (filePath == null || "".equals(filePath)) { log.info("文件路径不存在"); return; } String fileName = params.get("fileName"); String fullPath = filePath + "\\" + fileName; try { download(request,response, fullPath, fileName); } catch (Exception e) { log.error("{}",e); log.error("文件下载失败"); e.printStackTrace(); } } // 下载文件方法: public static void download(HttpServletRequest request, HttpServletResponse response, String filePath, String realName) throws Exception { response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("UTF-8"); BufferedInputStream bis = null; BufferedOutputStream bos = null; long fileLength = (new File(filePath)).length(); response.setContentType("application/octet-stream;charset=GBK"); response.setHeader("Content-disposition", "attachment; filename=" + new String(realName.getBytes("GB2312"), "ISO-8859-1")); response.setHeader("Content-Length", String.valueOf(fileLength)); bis = new BufferedInputStream(new FileInputStream(filePath)); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } bis.close(); bos.close(); }}
本文链接地址:https://www.jiuchutong.com/zhishi/295681.html 转载请保留说明!

上一篇:web前端面试高频考点——Vue的高级特性(动态组件、异步加载、keep-alive、mixin、Vuex、Vue-Router)(web前端面试题最新)

下一篇:前端是什么,是干嘛的(前端是指什么工作)

  • 成为运营大咖的4个学习面(成为运营大咖的理由)

    成为运营大咖的4个学习面(成为运营大咖的理由)

  • 天翼网关宽带灯不亮(天翼网关宽带灯不亮是欠费吗)

    天翼网关宽带灯不亮(天翼网关宽带灯不亮是欠费吗)

  • 腾讯会议怎么关闭声音(腾讯会议怎么关闭共享屏幕)

    腾讯会议怎么关闭声音(腾讯会议怎么关闭共享屏幕)

  • 微信未成年防沉迷修改(微信未成年防沉迷怎么破)

    微信未成年防沉迷修改(微信未成年防沉迷怎么破)

  • 手机4+64g够用吗

    手机4+64g够用吗

  • 抖音聊天列表怎么自动没有(抖音聊天列表怎么一键清空)

    抖音聊天列表怎么自动没有(抖音聊天列表怎么一键清空)

  • 手机快应用能卸载吗(手机快应用能卸载吗oppo)

    手机快应用能卸载吗(手机快应用能卸载吗oppo)

  • 淘宝账号是会员名还是淘宝昵称(淘宝账号会员名怎么才能修改)

    淘宝账号是会员名还是淘宝昵称(淘宝账号会员名怎么才能修改)

  • hp1536用什么硒鼓(hp1536用什么硒鼓 正大 康盛)

    hp1536用什么硒鼓(hp1536用什么硒鼓 正大 康盛)

  • 7p摄像头黑屏怎么修(7p摄像头黑屏怎么修多少钱)

    7p摄像头黑屏怎么修(7p摄像头黑屏怎么修多少钱)

  • 抖音怎么和别人连线(抖音怎么和别人合拍唱歌)

    抖音怎么和别人连线(抖音怎么和别人合拍唱歌)

  • 微信里的群公告是怎么一回事(微信里的群公告如何删除)

    微信里的群公告是怎么一回事(微信里的群公告如何删除)

  • qq十年前删除的好友还可以找到吗(qq十年前删除的照片能找回吗视频)

    qq十年前删除的好友还可以找到吗(qq十年前删除的照片能找回吗视频)

  • 旺旺昵称是淘宝昵称吗(淘宝的旺旺昵称是什么意思)

    旺旺昵称是淘宝昵称吗(淘宝的旺旺昵称是什么意思)

  • 手机屏幕花了是内屏坏了吗(手机屏幕花了是内屏坏了还是外屏坏了)

    手机屏幕花了是内屏坏了吗(手机屏幕花了是内屏坏了还是外屏坏了)

  • 内存条安装有正反面吗(内存条安装正反怎么插)

    内存条安装有正反面吗(内存条安装正反怎么插)

  • x299主板配什么cpu(x299主板配什么内存条)

    x299主板配什么cpu(x299主板配什么内存条)

  • 上传照片怎么改大小(上传照片怎么改格式)

    上传照片怎么改大小(上传照片怎么改格式)

  • 怎么查看qq情侣空间和谁开过(怎么查看qq情侣分数)

    怎么查看qq情侣空间和谁开过(怎么查看qq情侣分数)

  • 匿名投票会被发现吗(匿名投票会被发现嘛)

    匿名投票会被发现吗(匿名投票会被发现嘛)

  • 计算器键盘功能键介绍(计算器键盘功能介绍图)

    计算器键盘功能键介绍(计算器键盘功能介绍图)

  • 小爱同学可以连oppo吗(小爱同学可以连苹果手机吗)

    小爱同学可以连oppo吗(小爱同学可以连苹果手机吗)

  • 新手机前三次怎么充电(新手机前三次要充多久)

    新手机前三次怎么充电(新手机前三次要充多久)

  • cor_al00是什么型号(coral00是什么型号手机)

    cor_al00是什么型号(coral00是什么型号手机)

  • Win10系统的华硕电脑怎么使用人脸解锁? 华硕电脑设置面部识别的技巧(华硕自带win10系统)

    Win10系统的华硕电脑怎么使用人脸解锁? 华硕电脑设置面部识别的技巧(华硕自带win10系统)

  • React--》React组件变化每次都会导致重新渲染,如何解决?(react组件库有哪些)

    React--》React组件变化每次都会导致重新渲染,如何解决?(react组件库有哪些)

  • 已认证进项税额转出怎么做账务处理
  • 房产税城镇土地使用税税率
  • 企业当期的所得税费用
  • 建筑行业小规模纳税人免税政策
  • 一般纳税人登记证明
  • 融资租赁担保余值
  • 应交税费例子
  • 已认证专票有误怎么回事
  • 金税系统维护费可以全额抵扣吗
  • 明明申报了为什么显示没有申报
  • 土地转让缴纳增值税政策
  • 一般纳税人建筑公司都交什么税
  • 销售费用现金支付
  • 税务部门如何核定税额
  • 为什么算除税价不算税金
  • 业务招待费可以结转下年抵扣吗
  • 主营业务类别商业是什么
  • 城市垃圾处置费计入会计什么科目
  • 收到发票后怎么处理
  • 办税人员的职责和义务
  • 企业车辆保险费要按什么交印花税的
  • 十分钟看懂财务报表
  • 购买固定资产货款未付
  • 用一般户发工资会怎么样
  • 进口商品关税调整
  • 出口退税生产企业税率
  • 水利建设基金是税还是费
  • an exit
  • php stristr函数
  • 新会计制度出台的背景
  • php框架实例
  • 什么是webrip
  • 接受投资收到的现金计入
  • opencv拼接图片
  • nyud数据集
  • php在图片上添加文字
  • cynefin框架
  • 管理费用包括哪些部门的工资
  • 企业自行清算的条件是什么
  • 小企业库存商品会计分录
  • 持有至到期投资属于流动资产吗
  • 所得税汇算清缴调整项目
  • 借款需要缴纳个人所得税吗
  • 公司吸收合并是利好吗
  • 小规模收入账务
  • 建筑业增值税是什么意思
  • sql server s
  • 营改增后土地出让增值税
  • 个体工商户公帐转法人私人账户
  • 土地作为无形资产入账依据
  • 红冲发票显示发票状态不正常
  • 发货单票据格式
  • MySQL修改root账号密码的方法
  • php 访问数据库
  • 苹果电脑安全性
  • win1909版本
  • 高效管理者的三大技能 罗伯特卡茨
  • windowsserver2008r2密码重置
  • 如何配置samba配置文件
  • win7鼠标点了没反应
  • 安装ubuntu 20.10
  • 怎么调整桌面图标间距
  • win10快捷键合集
  • linux文件系统inode
  • 误删了一些文件电脑不能正常启动了
  • 麒麟Linux系统怎么进入图形化界面
  • 微信公众号javascript
  • shell脚本读取ini文件
  • nodejs xhr
  • android ashmem
  • 举例详解民法典第502条
  • jQuery tagsinput在h5邮件客户端中应用详解
  • android 科大讯飞语音引擎 调用无响应
  • linux shell脚本攻略(第3版)
  • Python装饰器基础详解
  • 说一说我下乡插队时的那点事
  • 常见python函数
  • 松原江北小吃一条街
  • 低丰度油气田开采的原油
  • 一般纳税人开增值税专票几个点
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设