Vue Bootstrap 静态服务器 实现文件上传

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

公司实现文件上传技术选型采用后端SpringBoot/Cloud,前端vue Bootstrap ,静态服务器作为文件存储,文件上传功能单独抽取封装文件上传组件,可供所有的文件的操作。

后端框架版本
SpringBoot2.5.6
Spring-Cloud2020.0.4
mysql8.0.26
pagehelper1.3.1
Mybatis2.2.0
Redis5.0
Fastjson1.2.78
前端框架版本
Vue2.6.11
axios0.24.0
vue-router3.5.3
Bootstrap4.6.2

文章目录

          • 一、前端部分
            • 1. 讲师页面
            • 2. js部分
            • 3. 文件上传组件
          • 二、后端
            • 2.1. 配置
            • 2.2. 配置
            • 2.3. api接口

一、前端部分
1. 讲师页面

讲师页面作为文件上传父页面

   <div class="form-group"><label class="col-sm-2 control-label">头像</label><div class="col-sm-10"><file v-bind:input-id="'image-upload'"v-bind:text="'上传头像'"v-bind:suffixs="['jpg', 'jpeg', 'png']"v-bind:use="FILE_USE.TEACHER.key"v-bind:after-upload="afterUpload"></file><div v-show="teacher.image" class="row"><div class="col-md-4"><img v-bind:src="teacher.image" class="img-responsive"></div></div></div></div>
2. js部分
<script>
import File from "../../components/file";
export default {components: {Pagination, BigFile,File},name: "business-teacher",data: function () {return {teacher: {},teachers: [],FILE_USE: FILE_USE,}},methods: {/*** 点击【新增】*/add() {let _this = this;_this.teacher = {};$("#form-modal").modal("show");},/*** 点击【编辑】*/edit(teacher) {let _this = this;_this.teacher = $.extend({}, teacher);$("#form-modal").modal("show");},/*** 列表查询*/list(page) {let _this = this;Loading.show();_this.$api.post(process.env.VUE_APP_SERVER + '/business/admin/teacher/list', {page: page,size: _this.$refs.pagination.size,}).then((response) => {Loading.hide();let resp = response.data;_this.teachers = resp.content.list;_this.$refs.pagination.render(page, resp.content.total);})},/*** 点击【保存】*/save() {let _this = this;// 保存校验if (1 != 1|| !Validator.require(_this.teacher.name, "姓名")|| !Validator.length(_this.teacher.name, "姓名", 1, 50)|| !Validator.length(_this.teacher.nickname, "昵称", 1, 50)|| !Validator.length(_this.teacher.image, "头像", 1, 100)|| !Validator.length(_this.teacher.position, "职位", 1, 50)|| !Validator.length(_this.teacher.motto, "座右铭", 1, 50)|| !Validator.length(_this.teacher.intro, "简介", 1, 500)) {return;}Loading.show();_this.$api.post(process.env.VUE_APP_SERVER + '/business/admin/teacher/save', _this.teacher).then((response) => {Loading.hide();let resp = response.data;if (resp.success) {$("#form-modal").modal("hide");_this.list(1);Toast.success("保存成功!");} else {Toast.warning(resp.message)}})},afterUpload(resp) {let _this = thislet image = resp.content.path;_this.teacher.image = image}}
}
</script>
3. 文件上传组件
<template><div><button type="button" v-on:click="selectFile()" class="btn btn-white btn-default btn-round"><i class="ace-icon fa fa-upload"></i>{{text}}</button><input class="hidden" type="file" ref="file" v-on:change="uploadFile()" v-bind:id="inputId+'-input'"></div>a
</template><script>
export default {name: 'file',props: {text: {default: "上传文件"},inputId: {default: "file-upload"},suffixs: {default: []},use: {default: ""},afterUpload: {type: Function,default: null},},data: function () {return {}},methods: {uploadFile () {let _this = this;let formData = new window.FormData();let file = _this.$refs.file.files[0];// 判断文件格式let suffixs = _this.suffixs;let fileName = file.name;let suffix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length).toLowerCase();let validateSuffix = false;for (let i = 0; i < suffixs.length; i++) {if (suffixs[i].toLowerCase() === suffix) {validateSuffix = true;break;}}if (!validateSuffix) {Toast.warning("文件格式不正确!只支持上传:" + suffixs.join(","));$("#" + _this.inputId + "-input").val("");return;}// key:"file"必须和后端controller参数名一致formData.append('file', file);formData.append('use', _this.use);Loading.show()_this.$api.post(process.env.VUE_APP_SERVER + '/file/admin/upload', formData).then((response) => {Loading.hide()let resp = response.dataconsole.log("上传文件成功:", resp)//回调父组件函数_this.afterUpload(resp)//解决 同一个文件上传2次或者大于3次,不会发生变化$("#" + _this.inputId + "-input").val("");})},selectFile() {let _this = this// console.log("_this.inputId",_this.inputId)$("#" + _this.inputId + "-input").trigger("click");}},
}
</script><style scoped>
</style>
二、后端
2.1. 配置
package com.course.file.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class SpingMvConfig implements WebMvcConfigurer {@Value("${file.path}")private String FILE_PATH;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/f/**").addResourceLocations("file:" + FILE_PATH);}
}
2.2. 配置
# 应用名称
spring.application.name=file
# 应用端口
server.port=9003
# 注册到eureka
eureka.client.service-url.defaultZone=http://localhost:8761/eureka# 请求访问前缀
server.servlet.context-path=/file# 本地存储静态文件路径
file.path=D:/file/imooc/course/
# 访问静态文件路径(用于文件回显或者文件下载)
file.domain=http://127.0.0.1:9000/file/f/# 文件大小(如果搭建大小超过此配置的大小或抛出异常)
spring.servlet.multipart.max-file-size=50MB
# 请求大小
spring.servlet.multipart.max-request-size=50MB
2.3. api接口
package com.course.file.controller.admin;import java.util.Date;import com.course.server.dto.FileDto;
import com.course.server.dto.ResponseDto;
import com.course.server.enums.FileUseEnum;
import com.course.server.service.FileService;
import com.course.server.util.UuidUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 javax.annotation.Resource;
import java.io.File;
import java.io.IOException;@RequestMapping("/admin")
@RestController
public class UploadController {public static final Logger LOG = LoggerFactory.getLogger(UploadController.class);public static final String BUSINESS_NAME = "文件上传";@Value("${file.domain}")private String FILE_DOMAIN;@Value("${file.path}")private String FILE_PATH;@Resourceprivate FileService fileService;@PostMapping("/upload")public ResponseDto upload(@RequestParam MultipartFile file, String use) throws IOException {String fileSize = String.valueOf(file.getSize());LOG.info("上传文件开始: {}", file);LOG.info("获取上传文件名称: {}", file.getOriginalFilename());LOG.info("上传文件大小: {}", fileSize);// 保存文件到本地FileUseEnum useEnum = FileUseEnum.getByCode(use);String key = UuidUtil.getShortUuid();String fileName = file.getOriginalFilename();String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();//如果文件夹不存在,则创建String dir = useEnum.name().toLowerCase();File fullDir = new File(FILE_PATH + dir);if (!fullDir.exists()) {fullDir.mkdirs();}String path = dir + File.separator + key + "." + suffix;String fullPath = FILE_PATH + path;File dest = new File(fullPath);file.transferTo(dest);LOG.info("上传文件全路径: {}", dest.getAbsolutePath());LOG.info("保存文件记录开始: {}");FileDto fileDto = new FileDto();fileDto.setPath(path);fileDto.setName(fileName);fileDto.setSuffix(suffix);fileDto.setUse(use);fileDto.setSize(Math.toIntExact(file.getSize()));fileService.save(fileDto);ResponseDto responseDto = new ResponseDto();fileDto.setPath(FILE_DOMAIN + path);responseDto.setContent(fileDto);return responseDto;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全防护部署,升级支持IPv6

场景描述 关键信息基础设施支持IPv6已经上升到国家战略&#xff0c;公共云基础设施为云上客户系统支持IPv6提供了完整的解决方案及产品。本最佳实践是在现有WAF和高防IP作为网络安全架构基础上&#xff0c;如何升级支持IPv6&#xff0c;同时满足云上和线下IDC需求&#xff0c;…

500道Java 必备面试题答案(过后即删)

每个技术人都有个大厂梦&#xff0c;我觉得这很正常&#xff0c;并不是饭后的谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司&#xff0c;如果说能够在这样的公司锻炼几年&#xff0c;相信对自己…

简单七步,快速入门 JMeter原生压测

导入本地的 JMeter 原生脚本&#xff0c;即可快速发起一次压测。 前提条件 JMeter 脚本需要在本地调试成功。请同时上传依赖的 CSV 或者 JAR 文件。CSV 文件的 File Name 只需要文件名&#xff0c;不要带路径&#xff0c;因为上传之后和 JMX 脚本在同目录下。 限制条件 最大…

创建VPC前,网络规划的4个问题你弄清了吗?

在创建VPC和交换机前&#xff0c;您需要结合具体的业务规划VPC和交换机的数量及网段等。 应该使用几个VPC&#xff1f;应该使用几个交换机&#xff1f;应该选择什么网段&#xff1f;VPC与VPC互通或VPC与本地数据中心互通有什么要求&#xff1f; 应该使用几个VPC&#xff1f; …

移动云2020 H1营收44.57亿元,同比增长556.4%

近日&#xff0c;中国移动《2020年中期业绩报告》发布&#xff0c;中国移动盈利能力继续保持全球一流运营商的领先水平&#xff0c;中国移动H1营运收入3899亿元人民币&#xff0c;同比增长0.1%&#xff1b;净利润558亿元人民币&#xff0c;同比下降0.5%&#xff1b;其中&#x…

中小型互联网企业迁移上云,保证云端资源安全迁移

场景描述 本方案主要适用于中小型互联网企业&#xff0c;从他云迁移到阿里云的最佳实践。方案中会概述网络规划、服务器、数据库、存储数据、 Kafka和镜像数据的迁移方案描述。同时在实践环节&#xff0c;增加服务器和RDS的迁移操作演练和验证。 解决问题 提供服务器、数据库…

Thymeleaf Error resolving template [index],template might not exist or might not be accessible

文章目录1. 导入依赖2. 配置2. 视图层3. 创建页面4. 检查target5. 表达式使用Thymeleaf 一共5步&#xff0c;检查一下看看是否符合规范 1. 导入依赖 <!--模板引擎--><dependency><groupId>org.springframework.boot</groupId><artifactId>sprin…

什么?一个核同时执行两个线程?

作者 | 轩辕之风来源 | 编程技术宇宙头图 | CSDN付费下载自视觉中国CPU里的时间Hi&#xff0c;好久不见&#xff0c;我是CPU一号车间的阿Q&#xff0c;不认识我的话&#xff0c;可以看看&#xff1a;完了&#xff01;CPU一味求快出事儿了&#xff01;真的是好久不见了&#xff…

海纳威上云 构建数字化透明工厂

“海纳威通过阿里巴巴的宜搭平台&#xff0c;开发了生产计划分配、计时计件、考勤与工资计算系统。宜搭的这种模式&#xff0c;可以按照我们自己的想法来设计软件&#xff0c;贴合现场业务来开发和调整&#xff0c;满足了管理诉求。效率很高&#xff0c;成本可控&#xff0c;和…

通用网站备案常见的备案场景及要求

当网站托管于中国大陆境内的服务器上时&#xff0c;网站需申请ICP备案。本文为您介绍常见网站的备案场景及备案要求。 通用网站备案 此种场景下&#xff1a; 托管于大陆境内服务器的网站需备案&#xff0c;托管于中国大陆境外服务器的网站无需备案。网站备案将会审核网站的三…

如何利用DTS数据同步功能,快速创建数据同步作业

数据传输服务DTS&#xff08;Data Transmission Service&#xff09;提供的数据同步功能简单易用&#xff0c;您只需在控制台上进行简单操作&#xff0c;即可完成整个数据同步作业的配置。 注意事项 本文仅简单介绍数据同步作业的通用配置流程&#xff0c;不同的数据源在配置…

震惊!程序员要放弃 Python 了!?发生了啥?

听说 Python 很难学&#xff1f;难在哪里&#xff1f;听说学完不知道做什么&#xff1f;为什么&#xff1f;Python 该怎么学&#xff1f;好不好学&#xff1f;学完做什么&#xff1f;许多人都会遇到了下面这些问题——1. 没经验根本不知道从何学起&#xff0c;而且应用方向太多…

如何快速完成企业应用IPv6改造

场景描述 对于IPv4-only的云服务器&#xff0c;通过DNS域名解析IPv6转换服务&#xff0c;快速支持对外提供IPv6访问能力。对于双栈云服务器&#xff0c;构建应用环境。 解决问题 改造技术复杂度高改造任务时间紧改造所需人力和设备成本较高 产品列表 虚拟专用网VPC弹性计算E…

上云七步走,助力垂直电商降本增效

甩开技术包袱&#xff0c;做出业务特色&#xff0c;越发成为垂直电商的生存之道 今天&#xff0c;人们通过天猫、淘宝、苏宁进行网络购物&#xff0c;不仅方便&#xff0c;而且快乐&#xff0c;通过盒马、饿了么享受更加快捷的本地生活服务&#xff0c;与此同时&#xff0c;家电…

3.3亿人都在用小程序,中国首次定义的互联网标准又有新进展

2020年&#xff0c;你的一天可能是这样度过。早晨&#xff0c;用天气小程序&#xff0c;看看立秋后天气是否降温&#xff1b;中午&#xff0c;用外卖小程序&#xff0c;点一份你最爱的水煮鱼&#xff1b;下午&#xff0c;用咖啡小程序&#xff0c;买一份4.8折的美式咖啡&#x…

Elasticsearch7.15.2 分布式集群安装(linux环境)

前言&#xff1a;一到六演示采用伪分布式&#xff0c;七单独介绍分布式集群方式 文章目录一、前期准备1. 下载2. 解压3.创建es用户4. 增加资源分配5. 内核参数6. 刷新 配置二、node1节点2.1. 重命名2.1. 编辑配置三、node2节点3.1. 复制node-13.2. 修改配置四、node3节点4.1. 复…

中小企业上云多地域办公组网,建立高质量云上内网环境

场景描述 举例企业存在三个网络&#xff1a;阿里云 VPC&#xff08;北京&#xff09;、云下北京 IDC&#xff0c;云下上海 IDC。SAG 可就近接入阿里云上海接入点CCN网络&#xff0c;并通过CEN 走阿里内网高质量链路连接北京阿里云 VPC。阿里云 VPC&#xff08;北京&#xff09…

简单五步,实现物联网批量创建设备

产品指某一类设备&#xff0c;创建完产品后&#xff0c;需要为具体设备创建身份。您可以创建单个设备&#xff0c;也可以批量创建设备。本文为您讲述如何批量创建设备。 操作步骤 1.登录物联网平台控制台。 2.在左侧导航栏&#xff0c;选择设备管理 > 设备&#xff0c;单…

Elasticsearch7.15.2 集成ik中文分词器 适用于单机和集群

文章目录一、下载部署1. 版本对应2. 下载ik3. 目录权限4. 切换es用户5. 启动es6. 验证es7. 切换kibana 用户8. 启动kibana9. 验证kibana二、ik分词测试2.1. 测试ik2.2. 分词器2.3. 最佳实践一、下载部署 1. 版本对应 软件Elasticsearch版本i版本k中文分词器版本Elasticsearch…

快速部署web项目上线云服务器

快速部署web项目上线云服务器 一、第一步登录腾讯云 1、登录腾讯云后&#xff0c;先购买或者在最新活动中免费领取一个十五天的云服务器产品 2、然后点击头像 3、在云产品选项中选择你需要的云服务器或轻量级应用服务器 4、我选择的是轻量级应用服务器&#xff0c;点击服务器…