【Java基础系列】文件上传功能

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.简单介绍
      • 1.需求背景
      • 2.使用的技术
    • 二.后端
      • 1.controller
      • 2.service
    • 三.前端
      • 1.vue 页面
      • 2.data
      • 3.提交方法

一.简单介绍

1.需求背景

上传文件的需求背景通常如下:

  1. 网络应用程序开发:
    • 在开发一个网络应用程序时,可能需要用户上传文件,比如头像、文档、照片等。
    • 需要设计一个用户友好的界面,让用户能够轻松地选择并上传文件。
    • 后端服务器需要相应的接口和逻辑来处理上传的文件,包括存储、验证和检查文件类型等。
  2. 数据收集和处理:
    • 在数据收集和处理的过程中,上传文件是获取大量数据的一种方式,比如用户提交的调查问卷、日志文件等。
    • 需要确保上传的文件格式符合预期,可能需要进行数据清洗和验证。
    • 后续可能需要对上传的数据进行分析、存储或其他处理。
  3. 团队协作平台:
    • 在团队协作平台上,可能需要上传文件以便分享和协作,比如共享文档、图片、视频等。
    • 安全性是一个重要考虑因素,需要确保上传的文件不包含恶意代码,可能需要进行安全性扫描。
  4. 学习管理系统:
    • 在教育领域,学习管理系统可能需要学生上传作业、报告或其他学术文件。
    • 教育机构可能需要一个系统来管理这些上传的文件,确保它们与相关课程和任务相关联。
  5. 云存储服务:
    • 云存储服务允许用户上传文件并在不同设备之间共享。
    • 这可能涉及到文件同步、版本控制、访问权限管理等问题。

2.使用的技术

  • 前端使用 vue
  • 前端 element-ui 上传组件 el-upload
  • 后端使用 SpringBoot

二.后端

1.controller

多文件上传使用 files 参数进行接收,在 service 层进行具体的业务实现。

@ApiOperation(value = "上传图片", nickname = "上传图片")
@PostMapping("/upload")
public Result handleFileUpload(@RequestParam("files") MultipartFile[] files) {
    this.picInfoService.handleFileUpload(files);
    return Result.ok("上传图片成功");
}

2.service

public interface PicInfoService extends IService<PicInfo> {
    /**
     * 上传图片
     *
     * @param file
     */
    void handleFileUpload(MultipartFile[] file);
}

首先遍历 files 文件,获取去掉后缀后的文件名,创建存储目录,上传到服务器,并保存图片路径,存储下来,方便前端 vue 进行图片预览和查看详情。

@Override
public void handleFileUpload(MultipartFile[] files) {
    for (MultipartFile file : files) {
        log.info("handleFileUpload() called with: file= {}", file.getOriginalFilename());
        if (file.isEmpty()) {
            return;
        }
        String fileNameWithoutExtension = this.getFileNameWithoutExtension(file.getOriginalFilename());
        PicInfo pic = this.getPicByName(fileNameWithoutExtension);
        if (Objects.isNull(pic)) {
            try {
                String uploadDir = "/kwan/img/";
                File dir = new File(uploadDir);
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                File serverFile = new File(uploadDir + file.getOriginalFilename());
                file.transferTo(serverFile);
                pic = new PicInfo();
                pic.setPicName(fileNameWithoutExtension);
                pic.setPicUrl("https://www.qinyingjie.top/img/" + file.getOriginalFilename());
                pic.setType(0);
                this.save(pic);
            } catch (IOException e) {
                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
    }
}

三.前端

1.vue 页面

主要是使用 el-upload 组件进行上传的,具体参数可以查看 element-ui 的官网 el-upload 组件的使用介绍。

<el-form :inline="true" :model="formInline" class="demo-form-inline">
  <el-form-item>
    <el-select size="small" v-model="picType" placeholder="请选择" @change="queryPic">
      <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
    </el-select>
  </el-form-item>
  <el-form-item>
    <el-button size="small" type="primary" @click="prepareAddPic">新增图片</el-button>
    <el-dialog title="新增图片" :visible.sync="addPicVisible" style="width: 100%">
      <el-upload ref="upload" :limit="30" accept=".jpg,.gif,.png,.jpeg,.txt,.pdf,.doc,.docx,.xls,.xlsx" name="files" multiple action="http://43.139.90.182:8888/picInfo/upload" :on-preview="handlePreview" :on-remove="handleRemove" :file-list="fileList" :auto-upload="false" :on-success="handleUploadSuccess">
        <el-button slot="trigger" size="small" type="primary">选择图片</el-button>
        <el-button style="margin-left: 10px" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
      </el-upload>
    </el-dialog>
  </el-form-item>
</el-form>

2.data

data() {
  return {
    form: {
      picUrl: '',
      type: 0,
    },
    formInline: {
      picType: 0,
    },
    //待上传的图片
    fileList: [],
    // 用户列表数据
    picList: [],
    loading: false,
    elementui_page_component_key: 0,
    currentPage: 1,
    pageSize: 6,
    total: 0,
    imageDialogVisible: false,
    addPicVisible: false,
    editPicVisible: false,
    enlargedImageUrl: '',
    currentRowId: null,
    imageIndex: 0, // 当前展示的图片索引
    options: [
      {
        value: 0,
        label: '宝宝',
      },
      {
        value: 1,
        label: '学习',
      },
      {
        value: 2,
        label: '风景',
      },
      {
        value: 3,
        label: '美女',
      },
      {
        value: 4,
        label: '猫咪',
      },
      {
        value: 5,
        label: '素材',
      },
      {
        value: 6,
        label: '动漫',
      },
      {
        value: 99,
        label: '其他',
      },
    ],
    picType: 0,
  }
},

3.提交方法

在方法模块定义如下提交方法

async submitUpload() { this.$refs.upload.submit() this.addPicVisible = false },

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

反思一次效能提升

前天与一个大佬交流。想起自己在6年多前在团队里做的一次小小的效能提升。 改进前 在同一个产品团队&#xff0c;同时有前端工程师和后端工程师。他们经常需要共同协作完成features。 前端是一个传统的多页应用。前端渲染是由后端的velocity模板引擎实现的。 打包后&#xff0c…

【电路笔记】-分流器

分流器 文章目录 分流器1、概述2、通用/网络配置3、无功分流器3.1 电阻电容分流器3.2 电阻-电感分流器 4、总结 我们在之前关于分压器的文中已经看到&#xff0c;分压过程是通过在串联配置中关联相同的组件来实现的。 在本文中&#xff0c;我们将重点关注电流分频器执行的电流分…

“不得了·放飞杯” 2023年四川省健身健美锦标赛启动在成都隆重召开

“不得了放飞杯” 2023年四川省健身健美锦标赛启动在成都隆重召开 为了更好地推动四川省健身健美运动的普及和发展&#xff0c;结合《四川全民健身实施计划》的现状&#xff0c;适应新时代健身私教服务产业的发展需求&#xff0c;由中国健美协会指导&#xff0c;四川省健美健美…

M2BLS

U are randomly generated&#xff0c;g is an activation function 辅助信息 作者未提供代码

如何通过ShardingJDBC进行读写分离

背景信息&#xff1a; 面对日益增加的系统访问量&#xff0c;数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说&#xff0c;将数据库拆分为主库和从库。其中主库负责处理事务性的增删改操作&#xff0c;从库负责处理查询操作&#…

【Qt绘制仪表盘】

目的 使用Qt的绘制事件绘制一个仪表盘 思路 需要创建一个带绘制事件的控件重写绘制事件显示 实现 以下是实现代码&#xff0c;可复制到程序到&#xff0c;直接运行。 .h // GaugeWidget.h #ifndef GAUGEWIDGET_H #define GAUGEWIDGET_H#include <QWidget>class Ga…

Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/3)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

【WSA】无法打开 适用于 Android™ 的 Windows 子系统,因为它处于脱机状态。可能缺少存储设备,或者存储设备已断开连接。

问题描述 之前可以正常使用适用于 Android™ 的 Windows 子系统&#xff08;WSA&#xff09;&#xff0c;但突然间无法启动了。 当尝试启动WSA中的软件时&#xff0c;都会出现以下错误提示&#xff1a; 无法打开 适用于 Android™ 的 Windows 子系统&#xff0c;因为它处于脱…

《微信小程序开发从入门到实战》学习三十

3.4 开发参与投票页面 3.3.7 获取用户信息 如果投票是实名投票&#xff0c;那么用户点击完成确认投票时&#xff0c;需要将用户投票信息和用户昵称一起提交&#xff0c;可以在JS文件中使用API接口wx.getuserInfo获取用户的信息。 使用wx.getUserInfo接口前需要对获取 用户信…

C语言—二维数组

一、二维数组的创建 int arr[3][4];char arr[3][5];double arr[2][4]; 数组创建&#xff1a;“[ ]”中要给一个常量&#xff0c;不能使用变量 二、二维数组的初始化 int arr[3][4]{1,2,3,4};int arr[3][4]{{1,2},{4,5}};int arr[][4]{{2,3},{4,5}}; 前面的为行&#xff0c…

ethernet II 的故事

以太帧有很多种类型。不同类型的帧具有不同的格式和MTU值。但在同种物理媒体上都可同时存在。 以太网第二版或者称之为Ethernet II 帧&#xff0c;DIX帧&#xff0c;是最常见的帧类型。并通常直接被IP协议使用。 格式 当数据帧到达网卡时&#xff0c;网卡要先去掉前导码&#…

leetcode刷题详解四

25. K 个一组翻转链表 这道题本质上还是用的反转前n个链表的思想。 具体细节如下&#xff1a; 先调用一次函数&#xff0c;使用一个newHead接受返回值&#xff0c;这个是为了方便最后函数的返回。 调用reverseN这个函数的时候&#xff0c;要标记反转这段链表的前置节点和后置节…

用户与组管理:如何在服务器系统中管理用户和权限

你是否想过&#xff0c;当你登录到一个服务器系统时&#xff0c;你是如何被识别和授权的&#xff1f;你是否知道&#xff0c;你可以通过创建和管理用户和组来简化和优化你的系统管理工作&#xff1f;你是否想了解一些常用的用户和组管理命令和技巧&#xff1f;如果你的答案是肯…

接口测试场景:怎么实现登录之后,需要进行昵称修改?

在接口测试中有一个这样的场景&#xff1a;登录之后&#xff0c;需要进行昵称修改&#xff0c;怎么实现&#xff1f; 首先我们分别看下登录、昵称修改的接口说明&#xff1a; 以上业务中补充一点&#xff0c;昵称修改&#xff0c;还需要添加请求头Authorization传登录获取的to…

03_MySQL基本SQL语句讲解

#课程目标 能够创建、删除数据表能够对表里的数据记录进行增加、删除、修改、查询操作能够创建、删除用户能够给用户授权并回收权限了解delete和truncate语句的区别 #一、数据库基本操作 ##1、查看数据库相关信息 mysql> show databases; 查看所有数据库 mysql>…

js逆向-某敏感网站登录参数分析

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 如果觉得文章对你有所帮助&#xff0c;可以给博主点击关注和收藏哦&#xff01; 前言 目标网站&#xff1a;aHR0cHM6Ly9tZGZnaGcuNXhwb2lqaHRm…

字符串转换成十进制整数

编程要求 输入一个以#结束的字符串&#xff0c;本题要求滤去所有的非十六进制字符&#xff08;不分大小写&#xff09;&#xff0c;组成一个新的表示十六进制数字的字符串&#xff0c;然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”&#xff0c;则…

【阿里云】图像识别 智能分类识别 增加网络控制功能点(三)

一、增加网络控制功能 实现需求TCP 心跳机制解决Soket异常断开问题 二、Linux内核提供了通过sysctl命令查看和配置TCP KeepAlive参数的方法。 查看当前系统的TCP KeepAlive参数修改TCP KeepAlive参数 三、C语言实现TCP KeepAlive功能 四、setsockopt用于设置套接字选项的系…

王者荣耀——Java

代码如下&#xff1a; sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\Desk…

linux账户管理实例二

要求&#xff1a;我的 用户pro1&#xff0c;pro2&#xff0c;pro3是同一个项目开发人员&#xff0c;想让这三个人用户在同一个目录下工作&#xff0c;但这三个人拥有自己的主文件夹和基本的私有用户组&#xff0c;工作目录为/srv/projecta&#xff0c;如何实现&#xff1f; 分…