为了解决海量数据存储与弹性扩容,项目中我们采用云存储的解决方案- 阿里云OSS。
(1)打开阿里云网站 https://www.aliyun.com/ (2)注册阿里云账户,最好使用支付宝,需要实名认证 (3)使用注册的用户登录阿里云里面 (4)找到阿里云oss (5)开通oss
(1)使用oss,首先创建bucket 创建说明 (2)控制台上传图片
1、准备工作:创建操作阿里云oss许可证(阿里云颁发id和秘钥)
2、文档位置
快速入门文档:https://help.aliyun.com/document_detail/32011.html?spm=a2c4g.11186623.6.905.23866328891B4P
3、具体使用
(1)创建Mavaen项目
(2)POM
<dependencies> <!--aliyunOSS--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>(3)找到编码时需要用到的常量值
endpointbucketNameaccessKeyIdaccessKeySecret(4)测试创建Bucket的连接
public class OSSTest { // Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 创建存储空间。 ossClient.createBucket(bucketName); // 关闭OSSClient。 ossClient.shutdown(); }(5)判断存储空间是否存在
@Test public void testExist() { // 创建OSSClient实例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); boolean exists = ossClient.doesBucketExist(bucketName); System.out.println(exists); // 关闭OSSClient。 ossClient.shutdown(); }(6)设置存储空间的访问权限
@Test public void testAccessControl() { // 创建OSSClient实例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 设置存储空间的访问权限为:公共读。 ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); // 关闭OSSClient。 ossClient.shutdown(); }service-oss上级模块service已经引入service的公共依赖,所以service-oss模块只需引入阿里云oss相关依赖即可, service父模块已经引入了service-base模块,所以Swagger相关默认已经引入
<dependencies> <!-- 阿里云oss依赖 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> </dependency> <!-- 日期工具栏依赖 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> </dependencies>启动时候,找数据库配置,但是现在模块因为不需要操作数据库,只是做了上传到oss功能,没有配置数据库。
解决方式:
(1)添加上数据库配置 (2)在启动类添加属性,默认不去加载数据库配置【推荐使用】
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)创建Service接口:OssService.java
public interface OssService { //上传头像到oss中 String uploadFileAvator(MultipartFile file); }实现:OssServiceImpl.java
参考SDK中的:Java ->上传文件 -> 简单上传 -> 流式上传 -> 上传文件流
package com.kuang.oss.service.impl; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.kuang.oss.service.OssService; import com.kuang.oss.utils.ConstantPropertiesUtils; import org.joda.time.DateTime; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.util.UUID; @Service public class OssServiceImpl implements OssService { //头像上传到oss @Override public String uploadFileAvator(MultipartFile file) { // 工具类获取值 String endpoint = ConstantPropertiesUtils.END_POINT; String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID; String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET; String bucketName = ConstantPropertiesUtils.BUCKET_NAME; try { // 创建OSS实例 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上传文件流。 InputStream inputStream = file.getInputStream(); //获取文件名称 String fileName = file.getOriginalFilename(); //在文件名称里面添加随机唯一的值 String uuid = UUID.randomUUID().toString().replaceAll("-",""); fileName = uuid + fileName; //把文件按日期进行分类 // 2020/10/08/1.jpg //获取当前日期 String datePath = new DateTime().toString("yyyy/MM/dd"); //拼接 fileName = datePath + "/" + fileName; //调用oss方法实现上传 //第一个参数 Bucket名称 //第二个参数 上传到oss文件路径和文件名称 aa/bb/1.jpg //第三个参数 上传文件输入流 ossClient.putObject(bucketName, fileName, inputStream); // 关闭OSSClient。 ossClient.shutdown(); //把上传之后文件路径返回 //需要把上传到阿里云oss路径手动拼接出来 // https://guli-edu-20201.oss-cn-beijing.aliyuncs.com/1.jpg String url = "https://"+bucketName+"."+endpoint+"/"+fileName; return url; }catch (Exception e){ e.printStackTrace(); return null; } } }创建controller:OssController.java
package com.kuang.oss.controller; import com.kuang.commonutils.R; import com.kuang.oss.service.OssService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @Api(description="阿里云文件管理") @RestController @RequestMapping("/eduoss/fileoss") @CrossOrigin public class OssController { @Autowired private OssService ossService; @ApiOperation(value = "文件上传") @PostMapping("/upload") public R uploadOssFile(@ApiParam(name = "file", value = "文件", required = true) @RequestParam("file") MultipartFile file){ //返回上传到oss的路径 String url = ossService.uploadFileAvator(file); return R.ok().data("url",url); } }http://localhost:8002/swagger-ui.html
下载官网:http://nginx.org/en/download.html
将nginx-1.12.0.zip解压到开发目录中 如:D:\develop\nginx-1.12.2 使用cmd启动nginx ,运行nginx.exe
系统会运行两个nginx进程。
特点:使用cmd启动nginx,如果关闭cmd窗口,nginx不会停止的。
需要使用nginx.exe -s stop 进行手动关闭,重启命令nginx -s reload
1、找到nginx配置文件D:\develop\nginx-1.12.2\conf\nginx.conf
2、在nginx.conf进行配置
(1)修改nginx默认端口,把 80 修改 81
(2)配置nginx转发规则
server { listen 9001; server_name localhost; location ~ /eduservice/ { proxy_pass http://localhost:8001; } location ~ /eduuser/ { proxy_pass http://localhost:8001; } location ~ /eduoss/ { proxy_pass http://localhost:8002; } location ~ /eduvod/ { proxy_pass http://localhost:8003; } location ~ /educms/ { proxy_pass http://localhost:8004; } location ~ /ucenterservice/ { proxy_pass http://localhost:8006; } location ~ /edumsm/ { proxy_pass http://localhost:8005; } location ~ /orderservice/ { proxy_pass http://localhost:8007; } location ~ /staservice/ { proxy_pass http://localhost:8008; } location ~ /admin/ { proxy_pass http://localhost:8009; } }3、修改前端请求地址
(1)修改config/dev.env.js
BASE_API: '"http://localhost:9001"',(2)重启前端程序
修改配置文件后,需要手动重启前端程序
使用element-ui组件实现。到源代码里面找到组件,复制到前端项目/src/components里面
src/views/edu/teacher/save.vue
<!-- 讲师头像 --> <el-form-item label="讲师头像"> <!-- 头衔缩略图 --> <pan-thumb :image="teacher.avatar"/> <!-- 文件上传按钮 --> <el-button type="primary" icon="el-icon-upload" @click="imagecropperShow=true">更换头像 </el-button> <!-- v-show:是否显示上传组件 :key:类似于id,如果一个页面多个图片上传控件,可以做区分 :url:后台上传的url地址 @close:关闭上传组件 @crop-upload-success:上传成功后的回调 <input type="file" name="file"/> --> <image-cropper v-show="imagecropperShow" :width="300" :height="300" :key="imagecropperKey" :url="BASE_API+'/eduoss/fileoss'" field="file" @close="close" @crop-upload-success="cropSuccess"/> </el-form-item>引入组件模块
import ImageCropper from '@/components/ImageCropper' import PanThumb from '@/components/PanThumb'config/dev.env.js中添加阿里云oss bucket地址
OSS_PATH: '"https://guli-file.oss-cn-beijing.aliyuncs.com"'组件中初始化头像默认地址
const defaultForm = { ......, avatar: process.env.OSS_PATH + '/avatar/default.jpg' }