【javaweb】学习日记Day11 - tlias智能管理系统 - 文件上传 新增 修改员工 配置文件

news2025/1/11 2:37:10

目录

一、员工管理功能开发

1、新增员工

postman报错500的原因

(1)Controller类

(2)Service类

(3)Mapper类

2、根据ID查询

(1)Controller类

(2)Service类

(3)Mapper类

3、修改员工

(1)Controller类

(2)Service类

(3)Mapper类

(4)配置动态sql - xml文件

4、员工管理代码综合展示 

(1)EmpController类

(2)EmpService 接口

(3)EmpServiceImpl 实现类

(4)EmpMapper类

(5)动态sql xml 文件

二、文件上传

(1)引入前端页面

1、本地存储方式

(1)Controller类

(2)配置properties文件

2、阿里云OSS对象存储

(1)准备工作

(2)前期配置

(3)配置Java访问凭证

(4)上传文件官方示例代码

3、阿里云OSS集成

(1)引入阿里云OSS上传文件工具类

(2)Controller类

4、文件上传代码综合展示

(1)UploadController类

(2)AliyunOSSUtils上传文件工具类

(3)AliyunOSSProperties属性类

三、配置文件

1、properties配置文件

​(1)文件上传工具类

①  @Value注解

(2)application.properties配置文件

2、yml配置文件

(1)用yml替换properties文件

3、@ConfigurationProperties

(1)定义存参数的实体类

(2)修改文件上传工具类


一、员工管理功能开发

1、新增员工

接口信息

  • 请求方式:POST —— @PostMapping
  • 请求路径:("/emps") 

请求参数

响应数据:直接Result.success()  

postman报错500的原因

大概率是mapper中sql语句写错了(把createtime写成了creatime,找了半天bug)

(1)Controller类

//添加员工
    @PostMapping
    public Result save(@RequestBody Emp emp)
    {
        log.info("新增员工:{}",emp);

        empService.save(emp);

        return Result.success();
    }

(2)Service类

    //新增员工
    void save(Emp emp);
    //新增员工
    @Override
    public void save(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());

        empmapper.insert(emp);
    }

(3)Mapper类

    //新增员工
    @Insert("insert into emp (username,name,gender,image,job,entrydate,dept_id,create_time,update_time) " +
            "values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    void insert(Emp emp);

2、根据ID查询

接口信息

  • 请求方式:GET —— @GetMapping
  • 请求路径:("/emps/{id}") 

请求参数

响应数据

(1)Controller类

    //根据id查询
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id)
    {
        log.info("根据ID查询员工信息,ID:{}",id);

        Emp emp = empService.getById(id);

        return Result.success(emp);
    }

(2)Service类

    //根据id查找员工
    Emp getById(Integer id);
    //根据id查找员工
    @Override
    public Emp getById(Integer id) {
        return empmapper.getById(id);
    }

(3)Mapper类

    //根据id查找员工
    @Select("select * from emp where id = #{id}")
    Emp getById(Integer id);

3、修改员工

接口信息

  • 请求方式:PUT—— @PutMapping
  • 请求路径:("/emps") 

请求参数: 

响应数据: 直接Result.success()  

(1)Controller类

    //修改员工
    @PutMapping
    public Result modify(@RequestBody Emp emp)
    {
        log.info("修改员工信息:{}",emp.getId());

        empService.modify(emp);

        return Result.success();
    }

(2)Service类

    //修改员工
    void modify(Emp emp);
    //修改员工
    @Override
    public void modify(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());

        empmapper.modify(emp);
    }

(3)Mapper类

    //修改员工
    void modify(Emp emp);

(4)配置动态sql - xml文件

    <!--更新员工-->
    <update id="modify">
        update emp
        <set>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="gender != null">
                gender = #{gender},
            </if>
            <if test="image != null and image != ''">
                image = #{image},
            </if>
            <if test="job != null">
                job = #{job},
            </if>
            <if test="entrydate != null">
                entrydate = #{entrydate},
            </if>
            <if test="deptId != null">
                dept_id = #{deptId},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime}
            </if>
        </set>
        where id = #{id}
    </update>

4、员工管理代码综合展示 

(1)EmpController类

//员工管理controller
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {

    @Autowired
    private EmpService empService;

    //分页查询
    @GetMapping
    public Result selectByPage(@RequestParam(defaultValue = "1") Integer page,
                               @RequestParam(defaultValue = "10") Integer pageSize,
                               String name, Short gender,
                               @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                               @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end)
    {
        log.info("分页查询,参数:{},{},{},{},{},{}",page,pageSize,name,gender,begin,end);

        PageBean pageBean = empService.selectByPage(page,pageSize,name,gender,begin,end);

        return Result.success(pageBean);
    }

    //删除员工
    @DeleteMapping("/{ids}")
    public Result delete(@PathVariable List<Integer> ids)
    {
        log.info("删除员工id:{}",ids);

        empService.delete(ids);

        return Result.success();
    }

    //添加员工
    @PostMapping
    public Result save(@RequestBody Emp emp)
    {
        log.info("新增员工:{}",emp);

        empService.save(emp);

        return Result.success();
    }

    //根据id查询
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id)
    {
        log.info("根据ID查询员工信息,ID:{}",id);

        Emp emp = empService.getById(id);

        return Result.success(emp);
    }

    //修改员工
    @PutMapping
    public Result modify(@RequestBody Emp emp)
    {
        log.info("修改员工信息:{}",emp.getId());

        empService.modify(emp);

        return Result.success();
    }
}

(2)EmpService 接口

public interface EmpService {

    //分页查询
    PageBean selectByPage(Integer page, Integer pageSize,
                          String name, Short gender,LocalDate begin,LocalDate end);

    //批量删除
    void delete(List<Integer> ids);

    //新增员工
    void save(Emp emp);

    //根据id查找员工
    Emp getById(Integer id);

    //修改员工
    void modify(Emp emp);
}

(3)EmpServiceImpl 实现类

@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empmapper;

    //分页查询
    @Override
    public PageBean selectByPage(Integer page, Integer pageSize, String name,
                                 Short gender, LocalDate begin, LocalDate end) {

        //1.设置分页参数
        PageHelper.startPage(page,pageSize);

        //2.执行查询
        List<Emp> empList = empmapper.list(name, gender, begin, end); //获取的是分页结果查询的封装类
        Page<Emp> p = (Page<Emp>) empList; //进行强制转换


        //3.封装PageBean对象
        PageBean pageBean = new PageBean(p.getTotal(),p.getResult());

        return pageBean;
    }

    //批量删除
    @Override
    public void delete(List<Integer> ids) {
        empmapper.delete(ids);
    }

    //新增员工
    @Override
    public void save(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());

        empmapper.insert(emp);
    }

    //根据id查找员工
    @Override
    public Emp getById(Integer id) {
        return empmapper.getById(id);
    }

    //修改员工
    @Override
    public void modify(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());

        empmapper.modify(emp);
    }
}

(4)EmpMapper类

@Mapper
public interface EmpMapper {
    
    //用pagehelper插件 - 分页查询获取列表数据
    public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);

    //新增员工
    @Insert("insert into emp (username,name,gender,image,job,entrydate,dept_id,create_time,update_time) " +
            "values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    void insert(Emp emp);

    //删除员工
    void delete(List<Integer> ids);

    //根据id查找员工
    @Select("select * from emp where id = #{id}")
    Emp getById(Integer id);

    //修改员工
    void modify(Emp emp);
}

(5)动态sql xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itroye.mapper.EmpMapper">
    <!--更新员工-->
    <update id="modify">
        update emp
        <set>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="gender != null">
                gender = #{gender},
            </if>
            <if test="image != null and image != ''">
                image = #{image},
            </if>
            <if test="job != null">
                job = #{job},
            </if>
            <if test="entrydate != null">
                entrydate = #{entrydate},
            </if>
            <if test="deptId != null">
                dept_id = #{deptId},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime}
            </if>
        </set>
        where id = #{id}
    </update>

    <!--批量删除-->
    <delete id="delete">
        delete
        from emp
        where id in
        <foreach collection="ids" item="x" separator="," open="(" close=")">
            #{x}
        </foreach>
    </delete>

    <!--条件查询-->
    <select id="list" resultType="com.itroye.pojo.Emp">
        select *
        from emp
        <where>
            <if test="name !=null and name != ''">
                name like concat('%',#{name},'%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>
    
</mapper>

二、文件上传

接口信息

请求参数

 

响应数据

 

(1)引入前端页面

将前端页面放resources文件的static目录下

上传文件三要素

1、本地存储方式

(1)Controller类

形参名要和前端传参名保持一致!

    @PostMapping("/upload")
    public Result upload(String username , Integer age, MultipartFile image) throws IOException //形参名要和前端传参名保持一致
    {
        log.info("文件上传:{},{},{}",username,age,image);

        //获取原始文件名
        String originalFilename = image.getOriginalFilename();

        //构造唯一文件名(不能重复) uuid(通用唯一识别码)
        int idx = originalFilename.lastIndexOf("."); //获取原始文件名最后一个点所在位置 也就是截取到".jpg"
        String extraname = originalFilename.substring(idx); //截取拓展名
        String newFileName = UUID.randomUUID().toString() + extraname;
        log.info("新的文件名:{}",newFileName);

        //将接受到的文件存在服务器磁盘目录中
        image.transferTo(new File("D:\\tlias.image\\"+newFileName));

        return Result.success();
    }

(2)配置properties文件

有的图片太大,无法上传,此时需要规定上传文件大小

#配置单个文件上传大小限制
spring.servlet.multipart.max-file-size=10MB

#配置单个请求最大大小的限制(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

2、阿里云OSS对象存储

阿里云-计算,为了无法计算的价值

(1)准备工作

各语言SDK参考文档_对象存储 OSS-阿里云帮助中心

Day11-04. 案例-文件上传-阿里云OSS-准备_哔哩哔哩_bilibili

(2)前期配置

将代码与启动类放一块

(3)配置Java访问凭证

如何为Java SDK配置访问凭证_对象存储 OSS-阿里云帮助中心

(4)上传文件官方示例代码

package com.itroye;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";

        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // 填写Bucket名称,例如examplebucket。
        String bucketName = "web-roye-tails";

        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        // 也就是放在阿里云OSS中的名称
        String objectName = "01.jpg";

        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "D:\\tlias.image\\MTXX_MH20231002_222415502.jpg";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
} 

运行后,在阿里云oss管理控制后台的文件管理处能看到我们上传的图片

 

3、阿里云OSS集成

(1)引入阿里云OSS上传文件工具类

由官方示例代码改造而来

/**
 * 阿里云 OSS 工具类
 */
@Component // 将此类作为bean交给ioc容器管理
public class AliOSSUtils {

    private String endpoint = "https://oss-cn-beijing.aliyuncs.com";
    private String accessKeyId = "LTAI5tJWzD965Xmw1B9NTsw9";
    private String accessKeySecret = "fra3BTIn5vSzuzATWDWboEUzlqvo4S";
    private String bucketName = "web-roye-tails";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖 生成随机uuid.jpg
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //生成新的文件访问路径url  即:https://web-roye-tails.oss-cn-beijing.aliyuncs.com/01.jpg
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

(2)Controller类

@Slf4j
@RestController
public class UploadController {

    @Autowired
    private AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        log.info("文件上传,文件名:{}",image.getOriginalFilename());

        //调用阿里云OSS工具类进行文件上传
        String url = aliOSSUtils.upload(image);
        log.info("文件上传完成,文件访问url:{}",url);

        return Result.success(url);
    }
}

4、文件上传代码综合展示

(1)UploadController类

@Slf4j
@RestController
public class UploadController {

    @Autowired
    private AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        log.info("文件上传,文件名:{}",image.getOriginalFilename());

        //调用阿里云OSS工具类进行文件上传
        String url = aliOSSUtils.upload(image);
        log.info("文件上传完成,文件访问url:{}",url);

        return Result.success(url);
    }

    // 本地上传
//    @PostMapping("/upload")
//    public Result upload(String username , Integer age, MultipartFile image) throws IOException //形参名要和前端传参名保持一致
//    {
//        log.info("文件上传:{},{},{}",username,age,image);
//
//        //获取原始文件名
//        String originalFilename = image.getOriginalFilename();
//
//        //构造唯一文件名(不能重复) uuid(通用唯一识别码)
//        int idx = originalFilename.lastIndexOf("."); //获取原始文件名最后一个点所在位置 也就是截取到".jpg"
//        String extraname = originalFilename.substring(idx); //截取拓展名
//        String newFileName = UUID.randomUUID().toString() + extraname;
//        log.info("新的文件名:{}",newFileName);
//
//        //将接受到的文件存在服务器磁盘目录中
//        image.transferTo(new File("D:\\tlias.image\\"+newFileName));
//
//        return Result.success();
//    }
}

(2)AliyunOSSUtils上传文件工具类

/**
 * 阿里云 OSS 工具类
 */
@Component // 将此类作为bean交给ioc容器管理
public class AliOSSUtils {

    @Autowired // 获取一系列属性值的bean对象注入
    private AliOSSProperties aliOSSProperties;

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        //获取阿里云oss参数
        String endpoint = aliOSSProperties.getEndpoint();
        String accessKeyId = aliOSSProperties.getAccessKeyId();
        String accessKeySecret = aliOSSProperties.getAccessKeySecret();
        String bucketName = aliOSSProperties.getBucketName();

        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖 生成随机uuid.jpg
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //生成新的文件访问路径url  即:https://web-roye-tails.oss-cn-beijing.aliyuncs.com/01.jpg
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

(3)AliyunOSSProperties属性类

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {

    private String endpoint;

    private String accessKeyId;

    private String accessKeySecret;

    private String bucketName;
}

三、配置文件

1、properties配置文件

配置信息在类内写死,不方便于项目后期维护,我们可以将该内容写在springboot的properties配置文件中

(1)文件上传工具类

①  @Value注解

通常用于外部配置属性一个一个地注入,@Value("${配置文件中的key}") 

@Component // 将此类作为bean交给ioc容器管理
public class AliOSSUtils {

    @Value("${aliyun.oss.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

(2)application.properties配置文件

#阿里云oss配置
aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=LTAI5tJWzD965Xmw1B9NTsw9
aliyun.oss.accessKeySecret=fra3BTIn5vSzuzATWDWboEUzlqvo4S
aliyun.oss.bucketName=web-roye-tails

2、yml配置文件

yml配置文件基本语法

  • 数值前必须有空格!
  • 使用缩进表示层级关系 

yml配置文件数据格式

  • 对象 / Map集合 
  • user:
      name:roye
      age:18
      password:1234
  • 数组 / List / Set集合
  • hobby:
      -java
      -game
      -sport

(1)用yml替换properties文件

备份一下properties文件! 

# properties文件
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/tlias

spring.datasource.username=root

spring.datasource.password=1234


mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

mybatis.configuration.map-underscore-to-camel-case=true


spring.servlet.multipart.max-file-size=10MB

spring.servlet.multipart.max-request-size=100MB


aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=LTAI5tJWzD965Xmw1B9NTsw9
aliyun.oss.accessKeySecret=fra3BTIn5vSzuzATWDWboEUzlqvo4S
aliyun.oss.bucketName=web-roye-tails

下面这个是yml文件 

spring:
  # 数据库连接信息
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tlias
    username: root
    password: 1234
  # 文件上传配置
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 100MB

# Mybatis配置
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

# 阿里云oss配置
aliyun:
  oss:
    endpoint: https://oss-cn-beijing.aliyuncs.com
    accessKeyId: LTAI5tJWzD965Xmw1B9NTsw9
    accessKeySecret: fra3BTIn5vSzuzATWDWboEUzlqvo4S
    bucketName: web-roye-tails


3、@ConfigurationProperties

可以批量地将外部属性配置注入到bean对象的属性中

  • 运用@Value注解一个一个注入属性值十分繁琐,因此我们单独生成一个实体类存放属性
  • 然后利用@Component将其作为bean文件交给IOC容器管理
  • 并用@ConfigurationProperties("前缀")将yml配置文件中的参数值与其联系起来

 

(1)定义存参数的实体类

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {

    private String endpoint;

    private String accessKeyId;

    private String accessKeySecret;

    private String bucketName;
}

(2)修改文件上传工具类

/**
 * 阿里云 OSS 工具类
 */
@Component // 将此类作为bean交给ioc容器管理
public class AliOSSUtils {

    @Autowired // 获取一系列属性值的bean对象注入
    private AliOSSProperties aliOSSProperties;

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        //获取阿里云oss参数
        String endpoint = aliOSSProperties.getEndpoint();
        String accessKeyId = aliOSSProperties.getAccessKeyId();
        String accessKeySecret = aliOSSProperties.getAccessKeySecret();
        String bucketName = aliOSSProperties.getBucketName();

        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖 生成随机uuid.jpg
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //生成新的文件访问路径url  即:https://web-roye-tails.oss-cn-beijing.aliyuncs.com/01.jpg
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

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

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

相关文章

【网络安全 --- kali2023安装】超详细的kali2023安装教程(提供镜像资源)

如果你还没有安装vmware 虚拟机&#xff0c;请参考下面博客安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;https://blog.csdn.net/m0…

mysql MVCC(多版本并发控制)理解

最近看MVCC相关资料&#xff0c;这边做一个记录总结&#xff0c;方便后续理解。 目录 一、MVCC相关概念 二、MVCC实现原理 1.隐藏字段 2.undo log 3.Read View 4.MVCC的整体处理流程 5. RC&#xff0c;RR级级别下的innoDB快照读有什么不同 6.总结 一、MVCC相关概念 1…

在Ubuntu中批量创建用户

一、背景知识 在Linux操作系统中创建新用户可以使用useradd或adduser命令。 使用useradd命令创建用户时&#xff0c;不会在/home目录下创建用户文件夹&#xff0c;需要用户自己指定主目录和bash目录的位置。同时&#xff0c;创建的用户没有设置密码&#xff0c;无法进行登录&a…

electronjs入门-聊天应用程序,与Electron.js通信

随着第一章中构建的应用程序&#xff0c;我们将开始将其与Electron框架中的模块集成&#xff0c;并以此为基础&#xff0c;以更实用的方式了解它们。 过程之间的通信 根据第二章中的解释&#xff0c;我们将发送每个进程之间的消息&#xff1b;具体来说联系人和聊天&#xff1…

对于无法直接获取URL的数据爬虫

在爬学校安全教育题库的时候发现题库分页实际上执行了一段js代码&#xff0c;如下图所示 点击下一页时是执行了函数doPostBack&#xff0c;查看页面源码如下 点击下一页后这段js提交了一个表单&#xff0c;随后后端返回对应数据&#xff0c;一开始尝试分析获取对应两个参数&a…

MM-Camera架构-ProcessCaptureRequest 流程分析

文章目录 processCaptureRequest\_3\_41.1 mDevice1.2 mDevice->ops->process\_capture\_request1.3 hardware to vendor mct\_shimlayer\_process\_event2.1 mct\_shimlayer\_handle\_parm2.2 mct\_shimlayer\_reg\_buffer processCaptureRequest_3_4 sdm660的摄像头走…

stm32的时钟、中断的配置(针对寄存器),一些基础知识

一、学习参考资料 &#xff08;1&#xff09;正点原子的寄存器源码。 &#xff08;2&#xff09;STM32F103最小系统板开发指南-寄存器版本_V1.1&#xff08;正点&#xff09; &#xff08;3&#xff09;STM32F103最小系统板开发指南-库函数版本_V1.1&#xff08;正点&#xff0…

QChart使用说明

一.使用说明 Qt官网例程&#xff1a;https://doc.qt.io/qt-5/qtcharts-examples.html QChart&#xff1a;用于管理图表中的线、图例和轴的图形表示。可以简单理解为是一个画布。QChartView&#xff1a;视图组件&#xff0c;无法单独进行显示&#xff0c;需要依附其他组件进行…

高德地图开发实战案例:实现信息弹出框的富文本展示效果

marker.content "<p classcardsBg></p>";.cardsBg {width: 246px;height: 426px;background: url(../images/cards.png) no-repeat center center; }其中cards.png为整个弹出模态框的背景图片&#xff0c;做到这一步。仍旧会自带高德地图的样式&#xf…

C指针【嵌入式】

一、到底什么是指针 1.指针变量和普通变量的区别 &#xff08;1&#xff09;首先非常关键的是&#xff0c;指针的实质就是一个变量&#xff0c;它根普通变量没有任何本质区别。指针完整的名字应该叫指针变量&#xff0c;简称为指针。 #include<stdio.h> void main(){//a…

perl语言——length.pl脚本(统计fasta文件序列长度)

Perl脚本——stat.pl&#xff08;统计fasta文件序列长度&#xff09; 相比Perl语言&#xff0c;现在python用的多。但是perl依旧是生信学习的一门课程&#xff0c;还是有人在写&#xff0c;所以你至少要会读。 #!/use/bin/perl #perl解析器$inputFile $ARGV[0]; #输…

ComplexHeatmap热图专栏 | 1.1 基础热图绘制

1 写在前面 最近在作图&#xff0c;一直在寻找《小杜的生信笔记》前期发表的代码。众所周知&#xff0c;小杜的教程基本都是平时自己用到的绘图教程&#xff0c;也是自己一个分享和总结。 自己在后期作图的时候&#xff0c;也会去寻找自己前期的教程作为基础&#xff0c;进行…

吃鸡达人必备!超实用干货激爽分享!

大家好&#xff01;作为一名专业吃鸡行家&#xff0c;今天我将为大家分享一些关于提高游戏战斗力和分享顶级游戏作战干货的秘诀&#xff0c;还有一些方便吃鸡作图、装备皮肤库存展示和查询的技巧&#xff01; 首先&#xff0c;让我们来介绍一些吃鸡作图工具推荐。无论是新手还是…

卷积神经网络的发展历史-VGG

VGG的产生 2014 年&#xff0c;Simonyan和Zisserman提出了VGG系列模型&#xff08;包括VGG-11/VGG-13/VGG-16/VGG-19&#xff09;&#xff0c;并在当年的ImageNet Challenge上作为分类任务第二名、定位&#xff08;Localization&#xff09;任务第一名的基础网络出现。 VGG的…

[数据结构]迷宫问题求解

目录 数据结构——迷宫问题求解&#xff1a;&#xff1a; 1.迷宫问题 2.迷宫最短路径问题 数据结构——迷宫问题求解&#xff1a;&#xff1a; 1.迷宫问题 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #includ…

mysql面试题26:MySQL中什么是MVCC,它的底层原理是什么

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是MVCC,它的底层原理是什么? MVCC(Multi-Version Concurrency Control)是一种并发控制机制,用于在数据库中实现并发事务的隔离性和一致性…

互联网Java工程师面试题·Redis 篇·第二弹

目录 16、Redis 集群方案什么情况下会导致整个集群不可用&#xff1f; 17、Redis 支持的 Java 客户端都有哪些&#xff1f;官方推荐用哪个&#xff1f; 18、Jedis 与 Redisson 对比有什么优缺点&#xff1f; 19、Redis 如何设置密码及验证密码&#xff1f; 20、说说 Redis…

卷积神经网络的发展历史-ResNet

ResNet的产生 2015 年&#xff0c;Kaiming He 提出了ResNet&#xff08;拿到了 2016 年 CVPR Best Paper Award&#xff09;&#xff0c;不仅解决了神经网络中的退化问题还在同年的ILSVRC和COCO 竞赛横扫竞争对手&#xff0c;分别拿下分类、定位、检测、分割任务的第一名。 R…

山东省赛二阶段第一部分解题思路

提交攻击者的IP地址 192.168.1.7 这个直接awk过滤一下ip次数&#xff0c;这个ip多得离谱&#xff0c;在日志里面也发现了它的恶意行为&#xff0c;后门&#xff0c;反弹shell 识别攻击者使用的操作系统 Linux 找出攻击者资产收集所使用的平台 shodan 提交攻击者目…

给 Linux0.11 添加网络通信功能 (Day3: 完成 MIT6.S081 最终实验 网卡驱动(1. 安装工具链和依赖))

url: https://pdos.csail.mit.edu/6.S081/2020/labs/net.html 首先看 tools章节&#xff1a;https://pdos.csail.mit.edu/6.S081/2020/tools.html 浏览了一下&#xff0c;就是要我们安装依赖 执行以下命令 sudo apt-get install git build-essential gdb-multiarch qemu-syst…