oss 与 nginx 安装与使用 execl 导入到数据库中 easyExcel

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin
public class OssController {
    @Autowired
    OssService ossService;
        //上传头像方法
    @PostMapping("/uploadOssFile")
    public R uploadOssFile(MultipartFile file){
        //获取上传文件
      String url=ossService.uploadFileAvator(file);
        return R.ok().data("url",url);
    }
}
public interface OssService {
    String uploadFileAvator(MultipartFile file);
}
@Service
public class OssServiceImpl implements OssService {
    @Override
    public String uploadFileAvator(MultipartFile file) {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = ConstantPropertiesUtils.END_POINT;
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
        // 填写Bucket名称,例如examplebucket。
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
        String uploadUrl = null;
         try {
             //判断oss实例是否存在:如果不存在则创建,如果存在则获取
             OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

             //获取上传文件流
             InputStream inputStream = file.getInputStream();
             String fileName = file.getOriginalFilename();
             //1让文件名称添加随机唯一值
             String uuid = UUID.randomUUID().toString().replaceAll("-", "");
                fileName=uuid+fileName;
                //2 把文件按照日期进行分类  /2019/11/12/01.jpg
             //获取当前日期
            // new SimpleDateFormat("yyyy-MM-dd hh-mm-ss").format(new Date());
                //直接调用 joda-time 工具包
             String datePath = new DateTime().toString("yyyy/MM/dd");
             String s = datePath + "/" + fileName;
             //文件上传至阿里云
             ossClient.putObject(bucketName, fileName, inputStream);
             // 关闭OSSClient。
             ossClient.shutdown();
             String url="https://"+bucketName+"."+endpoint+"/"+s;
             return url;
             //把上传文件路径返回  把上传阿里云路径手动拼接
             //https://teacher-service.oss-cn-nanjing.aliyuncs.com/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220718214253.jpg
             } catch (IOException e) {
             e.printStackTrace();
             return null;
             }

       }
    }
server.port=8002
spring.application.name=service-oss
spring.profiles.active=dev
aliyun.oss.file.endpoint=oss-cn-nanjing.aliyuncs.com
aliyun.oss.file.keyid=LTAI5t9L2oZH6ZbKA6CtKM6u
aliyun.oss.file.keysecret=3ju3wxy7PeG4LaUgVqi1BEUcOy8PXQ
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=teacher-service
logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <contextName>logback</contextName> <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --> <property name="log.path" value="D:/guli_1010/edu" /> <!-- 彩色日志 --> <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 --> <!-- magenta:洋红 --> <!-- boldMagenta:粗红--> <!-- cyan:青色 --> <!-- white:白色 --> <!-- magenta:洋红 --> <property name="CONSOLE_LOG_PATTERN" value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/> <!--输出到控制台--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--输出到文件--> <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_info.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 时间滚动输出 level为 WARN 日志 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_warn.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 时间滚动输出 level为 ERROR 日志 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_error.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender><logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 如果未设置此属性,那么当前logger将会继承上级的级别。 --> <!-- 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作: 第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息 第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别: --> <!--开发环境:打印控制台--> <springProfile name="dev"> <!--可以输出项目中的debug日志,包括mybatis的sql日志--> <logger name="com.guli" level="INFO" /> <!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG 可以包含零个或多个appender元素。 --> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> </root> </springProfile> <!--生产环境:输出到文件--> <springProfile name="pro"> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="ERROR_FILE" /> <appender-ref ref="WARN_FILE" /> </root> </springProfile> </configuration>
        <!-- 阿里云oss依赖 -->
       <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        </dependency>
        <!-- 日期工具栏依赖 -->
       <dependency>
       <groupId>joda-time</groupId>
       <artifactId>joda-time</artifactId>
       </dependency>

 

----

 

 

 

 

 

 

 

 

 

 

 

 

 nginx.conf

 

 

 

 worker_processes 1  全局的  多路复用

 

 

 

 worker_connections  worker最大连接数

 

 

 

 

 

~ 是代表正则表达式  当地址中包含eduservice 就会转发到8001端口

如果不加 ~ 就带表完全匹配

 

 

 

 

 在nginx.conf 最下面配置请求转发规则  如果出现错误 查看日志

    #请求转发配置
    server {
        listen       9001;
        server_name  localhost;
        location ~ /eduservice/ {
            proxy_pass http://localhost:8001;
        }
        location ~ /eduoss/ {
            proxy_pass http://localhost:8002;
        }
        
       }

 

 

--

上传头像

 

 

 

 

 

 

 ---

 

 

 

 

 

 

 

 

    <dependency>
    <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.1.1</version>
    </dependency>

 

 

public class TestEasyExcel {

    public static void main(String[] args) {
        //实现excel写的操作

        //设置写入文件夹地址和excel文件名称
        String filename="C:\\Users\\Administrator\\Desktop\\projiect\\test.xls";

        //调用easyexcel里面的方法实现写的操作
        EasyExcel.write(filename, DemoData.class).sheet("学生列表").doWrite(getData());
    }


    //创建方法返回list集合

    private static List<DemoData> getData(){
        List<DemoData> list=new ArrayList<>();
        for (int i = 0; i <10 ; i++) {
            DemoData data = new DemoData();
            data.setSno(i);
            data.setSname("lcc"+i);
            list.add(data);
        }
        return list;

    }
}

--

修改之前的实体类

 

 

 

 

 

 

//创建读取excel监听器
public class excelListener extends AnalysisEventListener<DemoData> {
    //会一行一行读取excel内容 除了表头
    @Override
    public void invoke(DemoData demoData, AnalysisContext analysisContext) {
        System.out.println("****"+demoData);
    }
    //读取表头
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头"+headMap);
    }
    //读取完成之后内容
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}
public class TestReadEasyExcel {

    public static void main(String[] args) {
        //实现excel写的操作
        //设置写入文件夹地址和excel文件名称
        String filename="C:\\Users\\Administrator\\Desktop\\projiect\\test.xls";
        //调用easyexcel里面的方法实现写的操作
        EasyExcel.read(filename, DemoData.class,new excelListener()).sheet("学生列表").doRead();
    }
}

 

---

@RestController
@RequestMapping("/eduservice/subject")
@CrossOrigin
public class EduSubjectController {

    @Autowired
    EduSubjectService eduSubjectService;
    //添加课程分类
    //获取上传过来的文件  把文件内容读取出来
    @PostMapping("/addSubject")
    public R addSubject(MultipartFile file){
        eduSubjectService.saveSubject(file,eduSubjectService);
        return R.ok();
    }
}
public interface EduSubjectService extends IService<EduSubject> {


    void saveSubject(MultipartFile file,EduSubjectService eduSubjectService);
}
@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject>
implements EduSubjectService{

    //添加课程分类
    @Override
    public void saveSubject(MultipartFile file,EduSubjectService eduSubjectService) {
        try {
            InputStream inputStream = file.getInputStream();
            EasyExcel.read(inputStream, SubjectData.class,new SubjectExcelListener(eduSubjectService)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {

    //因为SubjectExcelListener不能交给spring进行管理  需要自己new 不能注入其他对象
    public EduSubjectService eduSubjectService;

    public SubjectExcelListener() {
    }

    public SubjectExcelListener(EduSubjectService eduSubjectService) {
        this.eduSubjectService = eduSubjectService;
    }

    //读取excel内容  一行一行读取
    @Override
    public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
        if(subjectData==null){
            throw new GuliException(20001,"文件数据为空");
        }

        //每次读取有两个值  第一个值一级分类  第二个值二级分类
        //判断一级分类是否重复
        EduSubject oneSubject = this.existOneObject(eduSubjectService, subjectData.getOneSubjectName());

        if(oneSubject==null){
            //没有相同的一级分类  进行添加
            oneSubject = new EduSubject();
            oneSubject.setParentId("0");
            oneSubject.setTitle(subjectData.getOneSubjectName());//一级分类名称
            eduSubjectService.save(oneSubject);
        }

        //获取一级分类id值
            String pid=oneSubject.getId();
        System.out.println("------->"+pid);
        //每次读取有两个值  第一个值一级分类  第二个值二级分类
        //判断二级分类是否重复
        EduSubject twoSubject = this.existTwoObject(eduSubjectService, subjectData.getTwoSubjectName(),pid);

        if(twoSubject==null){
            //没有相同的一级分类  进行添加
            twoSubject = new EduSubject();
            twoSubject.setParentId(pid);
            twoSubject.setTitle(subjectData.getTwoSubjectName());//一级分类名称
            eduSubjectService.save(twoSubject);
        }

    }

    //判断一级分类 不能重复添加
        private EduSubject existOneObject(EduSubjectService eduSubjectService,String name){

            QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
            wrapper.eq("title", name)
                    .eq("parent_id", "0");
            EduSubject oneObject = eduSubjectService.getOne(wrapper);
            return oneObject;
        }

    //判断二级分类 不能重复添加
    private EduSubject existTwoObject(EduSubjectService eduSubjectService,String name,String pid){

        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title", name)
                .eq("parent_id", pid);
        EduSubject twoObject = eduSubjectService.getOne(wrapper);
        return twoObject;
    }


    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

 

posted @ 2022-07-24 23:01  花心大萝卜li  阅读(161)  评论(0)    收藏  举报