[推荐]SpringBoot java实现文件/附件上传下载 服务器 数据库 拿来就用,简单实用

news2024/7/6 17:37:14

推荐一个思路非常简单又很实用的文件上传下载方式,代码十分简练,可以开箱即用,下面是使用到的一些工具类和业务代码;

1.文件上传实现

判断文件类型的工具类,一些使用到的实体类我会凡在文末,需要可以的自取

    public static int fileType(String fileName) {
        if (fileName == null) {
            return 0;
        } else {
            // 获取文件后缀名并转化为写,用于后续比较
            String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
            // 创建图片类型数组
            String img[] = {"bmp", "jpg", "jpeg", "png", "tiff", "gif", "pcx", "tga", "exif", "fpx", "svg", "psd",
                    "cdr", "pcd", "dxf", "ufo", "eps", "ai", "raw", "wmf"};
            for (int i = 0; i < img.length; i++) {
                if (img[i].equals(fileType)) {
                    return 1;
                }
            }
            // 创建文档类型数组
            String document[] = {"txt", "doc", "docx", "xls", "htm", "html", "jsp", "rtf", "wpd", "pdf", "ppt"};
            for (int i = 0; i < document.length; i++) {
                if (document[i].equals(fileType)) {
                    return 2;
                }
            }
            // 创建视频类型数组
            String video[] = {"mp4", "avi", "mov", "wmv", "asf", "navi", "3 gp", "mkv", "f4v", "rmvb", "webm"};
            for (int i = 0; i < video.length; i++) {
                if (video[i].equals(fileType)) {
                    return 3;
                }
            }
            // 创建音乐类型数组
            String music[] = {"mp3", "wma", "wav", "mod", "ra", "cd", "md", "asf", "aac", "vqf", "ape", "mid", "ogg",
                    "m4a", "vqf"};
            for (int i = 0; i < music.length; i++) {
                if (music[i].equals(fileType)) {
                    return 4;
                }
            }
        }
        return 0;
    }

1.2 Controller层代码

部分小伙伴因为是springboot项目且版本大于2.3,@Valid注解报错找不到,需要手动添加依赖,如果对“优雅的Java参数校验”感兴趣的伙伴可以见我另一篇文章优雅的参数校验@Validated 实战 + 统一异常处理返回前端json 最全解析

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
@Api(tags = "附件管理")
@RestController
@RequestMapping("/attach")
public class AttachmentController {

    @Autowired
    private AttachmentService attachmentService;

    @PostMapping("/upload")
    @ApiOperation(value = "上传文件")
    public ResponseResult upload(@RequestPart("file") MultipartFile file,
                                 @RequestParam(value = "bussinessId") @Valid @NotBlank(message = "业务id不能为空") String bussinessId) throws Exception {
        return attachmentService.upload(file, bussinessId);
    }

1.3 Service层业务代码

接口类

import com.yuncheng.entity.ResponseResult;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

public interface AttachmentService {

     ResponseResult upload(MultipartFile file, String bussinessId) throws Exception;

}

实现类,注释很清晰了


import com.yuncheng.entity.ResponseResult;
import com.yuncheng.entity.enums.AppHttpCodeEnum;
import com.yuncheng.pc.entity.UploadFile;
import com.yuncheng.pc.mapper.UploadFileMapper;
import com.yuncheng.pc.service.AttachmentService;
import com.yuncheng.utils.Tools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class AttachmentServiceImpl implements AttachmentService {

    private static final String LOCAL_HOST = "http://10.11.0.104:8866/";

    @Autowired
    private UploadFileMapper uploadFileMapper;

    @Override
    @Transactional
    public ResponseResult upload(MultipartFile multipartFile, String bussinessId) throws Exception {
        if (multipartFile.isEmpty()) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,"上传文件为空");
        }
        UploadFile uploadFile = new UploadFile();
        // 保存原文件名称,文件列表展示需要用到
        uploadFile.setFileName(multipartFile.getOriginalFilename());
        // 生成系统文件名称,不可重复,防止同名文件上传覆盖问题
        String name = RandomStringUtils.randomAlphanumeric(32) + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")).toLowerCase();
        uploadFile.setName(name.substring(0, name.lastIndexOf(".")));
        uploadFile.setFileSuffix(multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")).toLowerCase());
        // 判断文件类型
        int fileType = Tools.fileType(name);
        uploadFile.setType(fileType);
        uploadFile.setDomain(LOCAL_HOST + "resource/files/");
        //这种方式比类型强转效率更高
        String pathExt = System.currentTimeMillis()+"";
        uploadFile.setPath(LOCAL_HOST + "resource/files/" + pathExt);
        uploadFile.setPathExt(pathExt);
        // 获取文件大小
        uploadFile.setSize((int)multipartFile.getSize());
        uploadFile.setBussinessId(bussinessId);
        uploadFile.setStatus(1);
        uploadFile.setCreateTime(new Date());
        uploadFile.setId(Tools.getCode32());
        uploadFileMapper.insert(uploadFile);

        // 将文件保存到本目录/resources/files/下
        // DateUtil.today()得到得是当天日期如:20230715,这个会在/resources/files/下再以日期生成一层目录
        File newFile = new File("./resources/files/"+ pathExt +  "/" + name);
        // 保证这个文件的父文件夹必须要存在
        if (!newFile.getParentFile().exists()) {
            newFile.getParentFile().mkdirs();
        }
        newFile.createNewFile();
        // 将文件内容写入到这个文件中
        InputStream is = multipartFile.getInputStream();
        FileOutputStream fos = new FileOutputStream(newFile);
        try {
            int len;
            byte[] buf = new byte[1024];
            while ((len = is.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
        } finally {
            // 关流顺序,先打开的后关闭
            fos.close();
            is.close();
        }

        // 返回文件信息给前端
        Map resultMap = new HashMap();
        resultMap.put("id", uploadFile.getId());
        resultMap.put("path", uploadFile.getPath());
        return ResponseResult.okResult(resultMap);
    }
}

1.4 Mapper层代码

import com.yuncheng.pc.entity.UploadFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UploadFileMapper {
    void insert(@Param("uploadFile") UploadFile uploadFile);
}

对应sql语句

    <insert id="insert">
        insert into "SYSDBA"."ATTACHMENT"("ID", "CREATE_BY", "CREATE_TIME", "STATUS", "UPDATE_BY",
                                          "UPDATE_TIME", "NAME", "FILE_NAME", "FILE_SUFFIX", "TYPE",
                                          "DOMAIN", "PATH", "PATH_EXT", "SIZE", "BUSSINESS_ID")
        VALUES(#{uploadFile.id},#{uploadFile.createBy},#{uploadFile.createTime},#{uploadFile.status},
               #{uploadFile.updateBy},#{uploadFile.updateTime},#{uploadFile.name},#{uploadFile.fileName},
               #{uploadFile.fileSuffix},#{uploadFile.type},#{uploadFile.domain},#{uploadFile.path},
               #{uploadFile.pathExt},#{uploadFile.size},#{uploadFile.bussinessId})
    </insert>

1.5 测试功能

至此文件上传代码就写好了,我们去postman测试一下,记住选post类型且文件类型要选对
在这里插入图片描述
点击发送即上传成功
在这里插入图片描述

2 文件下载代码

2.1 controller层代码

    @GetMapping("/download")
    @ApiOperation(value = "下载文件")
    public void download(HttpServletResponse response,
                                    @Valid @NotBlank(message = "id不能为空") String id) throws Exception {
         attachmentService.download(response, id);
    }

2.2 Service层代码

接口


ResponseResult download(HttpServletResponse response, String id) throws Exception;

实现类

    @Override
    public ResponseResult download(HttpServletResponse response, String id) throws Exception {
        List<UploadFile> uploadFiles = uploadFileMapper.selectOne(id, null, 1);
        if (CollectionUtils.isEmpty(uploadFiles)) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "查询文件为空");
        }

        // 去./resources/files/目录下取出文件
        File downloadFile = new File("./resources/files/" +uploadFiles.get(0).getPathExt() +  "/" + uploadFiles.get(0).getName() + uploadFiles.get(0).getFileSuffix());
        if (!downloadFile.exists() || downloadFile.length() == 0) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "查询文件为空");
        }

        InputStream is = null;
        OutputStream os = null;
        try {
            // 判断是否是图片,如果是图片加上 response.setContentType("image/jpeg"),这样就可以直接在浏览器打开而不是下载
            if (uploadFiles.get(0).getType() == 1) {
                response.setContentType("image/jpeg");
            }
            response.addHeader("Content-Length", "" + downloadFile.length());
            is = new FileInputStream(downloadFile);
            os = response.getOutputStream();
            IOUtils.copy(is, os);
        } catch (Exception e) {
            log.error("下载图片发生异常", e);
        } finally {
            try {
                if (os != null) {
                    os.flush();
                    os.close();
                }
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                log.error("关闭流发生异常", e);
            }
        }
        return ResponseResult.okResult("下载成功");
    }

2.3 Mapper层代码

    List<UploadFile> selectOne(@Param("id") String id, @Param("bussinessId") String bussinessId, @Param("status") Integer status);

对应SQL语句

    <select id="selectOne" resultType="com.yuncheng.pc.entity.UploadFile">
        select *
        from "SYSDBA"."ATTACHMENT"
        where status = #{status}
          <if test="id != null and id != ''">
              and id = #{id}
          </if>
          <if test="bussinessId != null and bussinessId != ''">
              and bussiness_id = #{bussinessId}
          </if>

    </select>

2.4 测试功能

在这里插入图片描述

下面是一些使用到的实体类和建表语句,有需要的小伙伴可以自取,如果觉得文章对您有用的话记得点赞 收藏 关注哦!!!,主页全是实用文章待你来取!

文件上传实体类

import lombok.Data;

import java.util.Date;

@Data
public class UploadFile {

    private String id;

    //文件在系统中的名称
    private String name;

    //文件名称
    private String fileName;

    //文件后缀
    private String fileSuffix;

    //文件类型
    private Integer type;

    //主目录
    private String domain;

    //完整目录
    private String path;
    
    //扩展目录
    private String pathExt;

    //文件大小
    private Integer size;

    //关联的业务id
    private String bussinessId;

    //逻辑删除状态
    private Integer status;

    private Date createTime;

    private String createBy;

    private Date updateTime;

    private String updateBy;
}

统一结果返回bean

import com.yuncheng.entity.enums.AppHttpCodeEnum;
import lombok.Data;

import java.io.Serializable;

/**
 * 通用的结果返回类
 * @param <T>
 */
@Data
public class ResponseResult<T> implements Serializable {

    private String token;

    private Integer code;

    private String message;

    private T data;

    private String status;

    public ResponseResult() {
        this.code = 200;
    }

    public ResponseResult(Integer code, T data) {
        this.code = code;
        this.data = data;
    }

    public ResponseResult(Integer code, String msg, T data) {
        this.code = code;
        this.message = msg;
        this.data = data;
    }

    public ResponseResult(Integer code, String msg) {
        this.code = code;
        this.message = msg;
    }

    public static ResponseResult okResult(int code, String msg) {
        ResponseResult result = new ResponseResult();
        return result.ok(code, null, msg);
    }

    public static ResponseResult okResult(int code, Object data,String msg) {
        ResponseResult result = new ResponseResult();
        return result.ok(code, data, msg);
    }

    public static ResponseResult okResult(Object data) {
        ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getMessage());
        if(data!=null) {
            result.setData(data);
        }
        return result;
    }

    public static ResponseResult errorResult(int code, String msg) {
        ResponseResult result = new ResponseResult();
        return result.error(code, msg);
    }

    public static ResponseResult errorResult(AppHttpCodeEnum enums){
        return setAppHttpCodeEnum(enums,enums.getMessage());
    }

    public static ResponseResult errorResult(AppHttpCodeEnum enums, String message){
        return setAppHttpCodeEnum(enums,message);
    }

    public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums){
        return okResult(enums.getCode(),enums.getMessage());
    }

    private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String message){
        return okResult(enums.getCode(),message);
    }

    public ResponseResult<?> error(Integer code, String msg) {
        this.code = code;
        this.message = msg;
        return this;
    }
    public ResponseResult<?> ok(Integer code, T data) {
        this.code = code;
        this.data = data;
        return this;
    }
    public ResponseResult<?> ok(Integer code, T data, String msg) {
        this.code = code;
        this.data = data;
        this.message = msg;
        return this;
    }
    public ResponseResult<?> ok(T data) {
        this.data = data;
        return this;
    }
}

状态码枚举类

package com.yuncheng.entity.enums;

public enum AppHttpCodeEnum {

    // 成功段固定为200
    SUCCESS(200,"操作成功"),

    // 登录段1~50
    NEED_LOGIN(1,"需要登录后操作"),
    LOGIN_PASSWORD_ERROR(2,"密码错误"),

    // TOKEN50~100
    TOKEN_INVALID(50,"无效的TOKEN"),
    TOKEN_EXPIRE(51,"TOKEN已过期"),
    TOKEN_REQUIRE(52,"TOKEN是必须的"),

    // SIGN验签 100~120
    SIGN_INVALID(100,"无效的SIGN"),
    SIG_TIMEOUT(101,"SIGN已过期"),

    // 参数错误 500~1000
    PARAM_REQUIRE(500,"缺少参数"),
    PARAM_INVALID(501,"无效参数"),
    PARAM_IMAGE_FORMAT_ERROR(502,"图片格式有误"),
    SERVER_ERROR(503,"服务器内部错误"),

    // 数据错误 1000~2000
    DATA_EXIST(1000,"数据已经存在"),
    AP_USER_DATA_NOT_EXIST(1001,"ApUser数据不存在"),
    DATA_NOT_EXIST(1002,"数据不存在"),
    DATA_DUPLICATE(1003,"数据重复"),
    OPERATION_FAILED(1004,"操作失败"),

    // 数据错误 3000~3500
    NO_OPERATOR_AUTH(3000,"无权限操作"),
    NEED_ADMIND(3001,"需要管理员权限");

    int code;
    String message;

    AppHttpCodeEnum(int code, String errorMessage){
        this.code = code;
        this.message = errorMessage;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

建表语句

CREATE TABLE "SYSDBA"."ATTACHMENT"
(
"ID" VARCHAR2(64) NOT NULL,
"CREATE_BY" VARCHAR(64),
"CREATE_TIME" TIMESTAMP(0),
"STATUS" INTEGER,
"UPDATE_BY" VARCHAR(64),
"UPDATE_TIME" TIMESTAMP(0),
"NAME" VARCHAR(100),
"FILE_NAME" VARCHAR(100),
"FILE_SUFFIX" VARCHAR(50),
"TYPE" INTEGER,
"DOMAIN" CHARACTER(100),
"PATH" VARCHAR(100),
"PATH_EXT" VARCHAR(50),
"SIZE" INTEGER,
"BUSSINESS_ID" VARCHAR(100) NOT NULL) STORAGE(ON "MAIN", CLUSTERBTR) ;

COMMENT ON TABLE "SYSDBA"."ATTACHMENT" IS '附件表';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."BUSSINESS_ID" IS '业务id';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."CREATE_BY" IS '创建人';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."CREATE_TIME" IS '创建日期';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."DOMAIN" IS '主目录';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."FILE_NAME" IS '原文件名';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."FILE_SUFFIX" IS '文件后缀';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."ID" IS '业务id';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."NAME" IS '系统文件名';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."PATH" IS '路径';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."PATH_EXT" IS '扩展目录';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."SIZE" IS '文件大小';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."STATUS" IS '删除标志';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."TYPE" IS '类型';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."UPDATE_BY" IS '更新人';
COMMENT ON COLUMN "SYSDBA"."ATTACHMENT"."UPDATE_TIME" IS '修改时间';

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

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

相关文章

【Hydro】部分基流分割方法及程序代码说明

目录 说明一、数字滤波法单参数数字滤波Lyne-Hollick滤波法Chapman滤波法Chapman-Maxwell滤波法Boughton-Chapman滤波法 双参数滤波法Eckhardt滤波法 二、其他基流分割方法基流指数&#xff08;BFI&#xff09;法时间步长&#xff08;HYSEP&#xff09;法PART法加里宁-阿里巴扬…

【JAVA学习笔记】60 - 坦克大战1.0-绘图坐标体系、事件处理机制

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter16/src/com/yinhai 绘图坐标体系 一、基本介绍 下图说明了Java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中&#xff0c;第一个是x坐标&#xff0c;表示当前位置为…

Leetcode循环队列(数组实现及链表实现)

这道题十分考验我们对队列的理解。 文章目录 队列的介绍队列的实现进入正题数组的方法链表实现 队列的介绍 队列是一种只允许在一段进行插入&#xff0c;在另一端进行删除的数据操作的特殊线性结构&#xff0c;&#xff0c;因此决定了他具有先入先出的特点&#xff0c;其中进行…

2023软件测试高薪必备pytest-yaml 测试平台-1.新增项目和用例

前言 基于pytest-yaml-yoyo 框架写的接口测试平台&#xff0c;在web网页平台上维护yaml测试用例&#xff0c;执行用例&#xff0c;并查看allure报告。 pytest-yaml-yoyo 框架简介 https://gitee.com/yoyoketang/pytest-yaml-yoyo 本框架只需pip安装即可上手 pip install pyt…

C++类和对象万字详解(典藏版)

文章目录 前言认识类和对象使用 struct 定义类class 定义类类的声明和定义分离类大小的计算this指针this指针的常见的面试题 构造函数与构析函数构造函数初始化列表 构析函数默认生成的构造函数和构析函数 拷贝构造函数默认类型转化与 explicit 关键字 static 成员变量运算符重…

判断字符串是否为json

//营业时间返回数组String businessDate merchantInfoResp.getBusinessDate();Object obj JSON.parse(businessDate);if (obj instanceof JSONArray) {merchantInfoResp.setBusinessDateDesc(JSON.parseArray(JSON.toJSONString(obj), Integer.class));} else {//营业日期判断…

YB2408CAX系列是一款高效、高频的同步降压DC-DC转换器,最高可带载2A连续电流。

概述: YB2408CAX系列是一款高效、高频的同步降压DC-DC转换器&#xff0c;最高可带载2A连续电流。YB2408CAX系列可在2.7V到5.5V的宽输入电源电压下工作。内部的主开关和同步开关管的RoSO非常小&#xff0c;从而传导损耗很小&#xff0c;效率很高。该款芯片工作开关频率为1.5MHz…

向中学生郑重推荐电视剧《狂花凋落》

笔者为什么要向网友&#xff0c;特别是要向中学生网友&#xff0c;郑重推荐能真实反应当年“文革”时期知识青年上山下乡悲惨遭遇的电视剧《狂花凋落》&#xff0c;因为如果真的再来上一次那种亘古未有的人间浩劫&#xff0c;那么在蜜糖里泡大、丁点儿苦都吃不下的当今中学生&a…

操作系统备考学习 day12 (第五章)

操作系统备考学习 day12 第五章 &#xff08;输入/输出&#xff09;I/O管理5.1 I/O管理概述5.1.1 I/O设备I/O设备的分类 5.1.2 I/O控制器I/O设备的电子部件 5.1.3 I/O控制方式程序直接控制方式中断驱动方式DMA方式DMA控制器通道控制方式 5.1.4 I/O软件层次结构用户层软件设备独…

直播电商大变局:店播时代终于来了!

店播时代终于来了。 直播在2023年双十一的亮点&#xff0c;也是焦点。今年双十一&#xff0c;舆论场的注意力都集中在了几大平台的头部主播身上&#xff0c;却少有人注意店播的表现——根据淘宝直播官方数据&#xff0c;10月31日淘宝直播上有29个直播间开局即破亿&#xff0c;…

Pytorch从零开始实战08

Pytorch从零开始实战——YOLOv5-C3模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-C3模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c…

应用层中一些零碎且易忘的知识点

邮件发送协议&#xff1a; SMTP&#xff1a;SMTP协议只能传送ASCII码文本数据&#xff0c;不能传送可执行文件或其他的二进制对象&#xff08;如带有图片、音频或视频数据的多媒体邮件&#xff09;MIMP&#xff1a;为解决SMTP传送非ASCII码文本的问题&#xff0c;提出了多用途因…

HR模块开发(1):简单的开发流程和注意事项

HR模块开发 一、模块概述 人力资源管理解决方案关注3个领域:每位雇员都发展和维护着‘公司内’和‘公司外’的种种‘关系’。运用科技,强化这些关系,可以提高忠诚度和生产力,公司整体得到商业价值。 员工关系管理员工职业生命周期管理员工事务处理管理HR模块的基本知识和构…

Linux: MV指令(覆盖替换重命名)

MV指令 mv [-bfiuv] [–help] [–version] [-S <附加字尾>] [-V <方法>] [源文件或目录] [目标文件或目录]-b 若需覆盖文件&#xff0c;则覆盖前先行备份-f 若目标文件或目录与现有的文件或目录重复&#xff0c;则直接覆盖现有的文件或目录-i 覆盖前先行询问用户–…

Python武器库开发-常用模块之copy模块(十五)

常用模块之copy模块(十五) 在Python编程中&#xff0c;我们经常遇到需要复制或拷贝数据的情况。为了避免不必要的问题和错误&#xff0c;Python提供了copy模块来处理复制操作。本文将介绍copy模块的用法&#xff0c;包括浅拷贝和深拷贝的概念以及如何在不同场景中使用。 我们…

【有源码】基于Python的篮球人才管理系统Springboot的篮球竞赛管理系统(源码、调试、lw、开题报告、ppt)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

算法题:16. 最接近的三数之和(Python Java 详解)

解题思路 Step1&#xff1a;先对数组排序&#xff0c;然后设置3个指针&#xff0c;指针1遍历范围为&#xff08;0~数组长度减2&#xff09;。 Step2&#xff1a;指针1位置确定时&#xff0c;指针1后面的数组元素首位各放置一个指针&#xff08;指针2、指针3&#xff09;。 S…

006 Linux 进程的概念 | 获取进程的PID

前言 本文将会向您进程的概念&#xff0c;程序与进程的区别&#xff0c;如何获取进程的标识符-pid 文章重点 1.描述进程——PCB 进程与程序的区别 CPU对进程列表的处理 2.获取进程PID 描述进程-PCB 进程概念 课本概念&#xff1a;程序的一个执行实例或正在执行的程序 内核…

在Flask中实现文件上传七牛云中并下载

在Flask中实现文件上传和七牛云集成 文件上传是Web应用中常见的功能之一&#xff0c;而七牛云则提供了强大的云存储服务&#xff0c;使得文件存储和管理变得更加便捷。在本篇博客中&#xff0c;我们将学习如何在Flask应用中实现文件上传&#xff0c;并将上传的文件保存到七牛云…