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) { } }

浙公网安备 33010602011771号