位置: IT常识 - 正文

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

发布时间:2024-01-14
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前端面试题最新)

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

  • 支付宝小青松在哪领取(支付宝小青松在哪里找到)

    支付宝小青松在哪领取(支付宝小青松在哪里找到)

  • 荣耀60能用鸿蒙系统吗(荣耀60能用鸿蒙操作系统吗)

    荣耀60能用鸿蒙系统吗(荣耀60能用鸿蒙操作系统吗)

  • 书旗怎么导入本地小说(书旗怎么添加本地小说)

    书旗怎么导入本地小说(书旗怎么添加本地小说)

  • QQ怎么查看定时未发出去的说说(qq怎么查看定时的说说怎么取消)

    QQ怎么查看定时未发出去的说说(qq怎么查看定时的说说怎么取消)

  • 苹果蓝牙耳机如何接电话(苹果蓝牙耳机如何看电量)

    苹果蓝牙耳机如何接电话(苹果蓝牙耳机如何看电量)

  • 小米手机无线网络连接上但上不了网怎么办(小米手机无线网络连接不上怎么办)

    小米手机无线网络连接上但上不了网怎么办(小米手机无线网络连接不上怎么办)

  • thunderbolt接口用途(thunderbolt4.0接口)

    thunderbolt接口用途(thunderbolt4.0接口)

  • 路由器可以连接wifi吗(路由器可以连接手机热点吗)

    路由器可以连接wifi吗(路由器可以连接手机热点吗)

  • 抖音如何显示在线状态(抖音如何显示在其他应用的上方)

    抖音如何显示在线状态(抖音如何显示在其他应用的上方)

  • 芒果tv不能开弹幕么(芒果tv咋开不了弹幕)

    芒果tv不能开弹幕么(芒果tv咋开不了弹幕)

  • qq永久封号的原因有哪些(qq永久封号的原因怎么查)

    qq永久封号的原因有哪些(qq永久封号的原因怎么查)

  • 小度识别不到无线网(小度识别不到无线耳机)

    小度识别不到无线网(小度识别不到无线耳机)

  • 华为nova7有双系统吗(华为nova7双系统怎么用)

    华为nova7有双系统吗(华为nova7双系统怎么用)

  • 泰国电源插头是哪种(泰国电源插头是欧标吗)

    泰国电源插头是哪种(泰国电源插头是欧标吗)

  • 华为mate30pro多大的屏幕(华为mate30pro多大像素)

    华为mate30pro多大的屏幕(华为mate30pro多大像素)

  • 美图秀秀不发布就不能保存吗(美图秀秀 发布)

    美图秀秀不发布就不能保存吗(美图秀秀 发布)

  • vivo手机没信号怎么办(vivo手机没信号无服务怎么解决)

    vivo手机没信号怎么办(vivo手机没信号无服务怎么解决)

  • 户户通未授权怎么办(户户通未授权怎么能授权)

    户户通未授权怎么办(户户通未授权怎么能授权)

  • 手机wps怎么合并单元格(手机wps怎么合并两个pdf文件)

    手机wps怎么合并单元格(手机wps怎么合并两个pdf文件)

  • 快手戳一下怎么取消关注(快手戳一下怎么取消掉)

    快手戳一下怎么取消关注(快手戳一下怎么取消掉)

  • 华为手机出现talkback(华为手机开不了机)

    华为手机出现talkback(华为手机开不了机)

  • 小米手环怎么设置睡眠(小米手环怎么设置锁屏密码)

    小米手环怎么设置睡眠(小米手环怎么设置锁屏密码)

  • 苹果x怎么开home键(苹果x怎么开省电模式)

    苹果x怎么开home键(苹果x怎么开省电模式)

  • 欧太力密码锁忘记密码怎么办(欧太力密码锁打不开怎么办)

    欧太力密码锁忘记密码怎么办(欧太力密码锁打不开怎么办)

  • 钢化膜有彩虹纹怎么办(钢化膜有彩虹纹对眼睛有害吗)

    钢化膜有彩虹纹怎么办(钢化膜有彩虹纹对眼睛有害吗)

  • 刷宝看视频怎么没有元宝了(刷宝视频怎么用自己的音乐)

    刷宝看视频怎么没有元宝了(刷宝视频怎么用自己的音乐)

  • 苹果无线耳机电量显示(苹果无线耳机电量在哪看)

    苹果无线耳机电量显示(苹果无线耳机电量在哪看)

  • 手机iso文件怎么打开(手机iso文件怎么删除)

    手机iso文件怎么打开(手机iso文件怎么删除)

  • 天猫如何申请品牌(天猫如何申请品牌授权)

    天猫如何申请品牌(天猫如何申请品牌授权)

  • ChatGPT加强版GPT-4面世,打工人的方式将被颠覆(gpt3 plug)

    ChatGPT加强版GPT-4面世,打工人的方式将被颠覆(gpt3 plug)

  • 房地产增值税预缴规定
  • 划转国有划拨土地要交契税吗?
  • 企业为何放弃免税政策
  • 公积金贷款金额少怎么办
  • 2021年专项附加扣除必须要确认吗
  • 物业缴纳发票可以抵税吗
  • 企业购买理财都需先交税再提现吗
  • 年报资产总额是期末余额吗
  • 期末存货采用成本与可变现净值孰低法
  • 资产负债表应交税金负数是什么意思
  • 坏账准备贷方核算内容
  • 停业的纳税人还交税吗
  • 土地增值税清算是什么意思
  • 电子凭证是否具有法律效力
  • 库存商品未入库
  • 税务局返还的代征代扣要交增值税吗
  • 变更财务负责人在网上变更流程
  • 所得税季度申报表营业成本怎么填
  • 外商投资企业补税政策
  • 建筑业进项税额转出
  • 中央空调使用费怎么开发票
  • 应交税费的明细账怎么手工登记
  • 销售回购会计分录
  • 暂估在建工程会计科目
  • windows11怎么安装iis
  • 笔记本如何打开无线网络开关
  • 企业购进房产怎么抵扣
  • 消费税不可抵扣已纳税款
  • ctl.start
  • 火灾造成存货损失应该作为报废还是盘亏
  • 本期发出存货成本是什么意思
  • 残疾人就业保障金计入什么科目
  • 自建办公楼装修效果图
  • 位于阿曼和迪拜的大学
  • 小微企业的季度所得税怎么计算
  • css转换器
  • web自动化测试项目
  • 认缴制情况下 公司一定要出资到位再注销吗
  • 跨境电商企业要进入某个国家的市场 必须先做的工作是
  • 普通发票退税流程图
  • js继承方式及其优缺点
  • 固定资产减值损失属于营业外支出吗
  • 收到的赔款,罚款怎么算
  • python os.path.join()函数的使用
  • 应付福利费算支出吗
  • 城建税的减免规定有哪些
  • 深入mysql源码
  • 一般劳务报酬个人所得税退税吗
  • 资质办理属于什么开票大类
  • 2019年无形资产的摊销额为
  • 行政单位应缴预算款原则上按月缴清
  • 个人社保和公积金
  • 办理房产证的时候可以加孩子的名字吗
  • 已经认证的进项发票在哪里查询
  • 间接费用的分配公式
  • 购买药材的发票如何抵扣?
  • 企业处理原材料会计分录
  • 关于mysql中的字符型数据下面说法正确的是
  • mysql错误代码1418
  • win8系统连接vpn失败提示错误代码807的解决方法
  • linux进程管理器
  • debian安装配置清华源
  • linux系统中命令什么大小写
  • scrtkfg.exe - scrtkfg是什么进程 有什么用
  • windows8 应用商店
  • 如何解决windows不是正版的问题
  • linux sh
  • win7开机系统恢复
  • jquery异步获取数据
  • 交互式shell是什么意思
  • fragment中嵌套fragment
  • jquery获取元素父级body高度
  • linux pythonide
  • 湖南国家电子税务局手机版
  • 税务局核查研发费举措
  • 欠税务局税款的后果
  • 南京税务局几点下班
  • 个人自行申报纳税
  • 广告行业税率6%包含的内容
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号