日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Day6 - 头像存储与EasyExcel

發(fā)布時(shí)間:2024/3/12 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Day6 - 头像存储与EasyExcel 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 一. 阿里云OSS存儲(chǔ)
      • 1. 注冊(cè)并創(chuàng)建存儲(chǔ)空間
      • 2. 獲取 key
      • 3. 官方文檔
    • 二. 頭像上傳后臺(tái)開(kāi)發(fā)
      • 1. service-oss 模塊搭建
      • 2. 后臺(tái)上傳代碼
    • 三. nginx 請(qǐng)求轉(zhuǎn)發(fā)
      • 1. nginx 基礎(chǔ)概念
      • 2. 實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)
    • 四. 頭像上傳前端代碼
      • 1. 導(dǎo)入上傳文件模塊
      • 2. 頭像上傳組件
    • 五. EasyExcel的使用
      • 1. 引入 pom 依賴
      • 2. 寫操作
      • 3. 讀操作

一. 阿里云OSS存儲(chǔ)

阿里云的對(duì)象存儲(chǔ) OSS 提供海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),很多公司都會(huì)使用它來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ)。因此,我們將講師頭像存儲(chǔ)在這里。

1. 注冊(cè)并創(chuàng)建存儲(chǔ)空間

進(jìn)入阿里云官網(wǎng),注冊(cè)賬號(hào)登錄,并實(shí)名認(rèn)證。之后找到 OSS 存儲(chǔ):

進(jìn)入后點(diǎn)擊【立即開(kāi)通】,開(kāi)通成功后,按鈕變?yōu)椤竟芾砜刂婆_(tái)】,點(diǎn)擊后進(jìn)入下列頁(yè)面。點(diǎn)擊【創(chuàng)建 Buket】即可創(chuàng)建一個(gè)存儲(chǔ)空間:

點(diǎn)擊剛創(chuàng)建的 bucket 名稱,可以查看存儲(chǔ)的東西,或者上傳文件:

2. 獲取 key

在主頁(yè)面,有一個(gè)【Access Key】按鈕,點(diǎn)擊后按照要求獲取 key 供后續(xù)代碼使用:

3. 官方文檔

阿里云 OSS Java 使用官方文檔

(1)安裝

在pom.xml中添加:

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version> </dependency>

(2)使用代碼創(chuàng)建存儲(chǔ)空間

// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,風(fēng)險(xiǎn)很高。強(qiáng)烈建議您創(chuàng)建并使用RAM賬號(hào)進(jìn)行API訪問(wèn)或日常運(yùn)維,請(qǐng)登錄 https://ram.console.aliyun.com 創(chuàng)建RAM賬號(hào)。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>";// 創(chuàng)建OSSClient實(shí)例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 創(chuàng)建存儲(chǔ)空間。 ossClient.createBucket(bucketName);// 關(guān)閉OSSClient。 ossClient.shutdown();

(3)上傳文件流

// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 云賬號(hào)AccessKey有所有API訪問(wèn)權(quán)限,建議遵循阿里云安全最佳實(shí)踐,創(chuàng)建并使用RAM子賬號(hào)進(jìn)行API訪問(wèn)或日常運(yùn)維,請(qǐng)登錄 https://ram.console.aliyun.com 創(chuàng)建。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>";// 創(chuàng)建OSSClient實(shí)例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 上傳文件流。 InputStream inputStream = new FileInputStream("<yourlocalFile>"); ossClient.putObject("<yourBucketName>", "<yourObjectName>", inputStream);// 關(guān)閉OSSClient。 ossClient.shutdown();

二. 頭像上傳后臺(tái)開(kāi)發(fā)

1. service-oss 模塊搭建

(1)在 service 下右鍵選擇 New Module… 創(chuàng)建一個(gè)子模塊 service-oss;
(2)在 pom.xml 中添加 oss 依賴(版本信息在主模塊中已經(jīng)配置了):

<dependencies><!--阿里云oss依賴--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId></dependency> </dependencies>

(3)創(chuàng)建 application.properties 以及啟動(dòng)類文件:

#服務(wù)端口號(hào) server.port=8082#服務(wù)名 spring.application.name=service-oss #環(huán)境設(shè)置 spring.profiles.active=dev#阿里云 OSS #不同的服務(wù)器,地址不同 aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com aliyun.oss.file.keyid=LTAI4GEMTPi4AYWfHuxkiGA9 aliyun.oss.file.keysecret=ijJ10mCflSnbVc89V3zFIYT3zQqpze #bucket可以在控制臺(tái)創(chuàng)建,也可以使用java代碼創(chuàng)建 aliyun.oss.file.bucketname=guli-edu-avatar-2020

要注意一點(diǎn),由于上述配置文件中不需要配置數(shù)據(jù)庫(kù)相關(guān)內(nèi)容,啟動(dòng)時(shí)會(huì)報(bào)錯(cuò),因此下面 @SpringBootApplication 注解中要加上 exclude = DataSourceAutoConfiguration.class

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @ComponentScan(basePackages = {"com.atguigu"}) public class OssApplication {public static void main(String[] args) {SpringApplication.run(OssApplication.class, args);} }

2. 后臺(tái)上傳代碼

(1)獲取配置文件中的 OSS 各項(xiàng)值;

配置文件中的值可以通過(guò) @Value(${xxx}) 注解進(jìn)行獲取,創(chuàng)建一個(gè)Util類專門用于獲取配置文件中的值。但由于此時(shí)值是 private 的,所以需要將其賦值給一個(gè)public 對(duì)象??梢詫?shí)現(xiàn) InitializingBean 接口中的 afterPropertiesSet 方法,它在項(xiàng)目啟動(dòng)時(shí),獲取到值后即被調(diào)用。

注意這里不能直接定義 public 對(duì)象,再在它的上面加@Value注解,值會(huì)取不到。

@Component public class ConstantPropertiesUtil implements InitializingBean {@Value("${aliyun.oss.file.endpoint}")private String endPoint;@Value("${aliyun.oss.file.keyid}")private String keyId;@Value("${aliyun.oss.file.keysecret}")private String keySecret;@Value("${aliyun.oss.file.bucketname}")private String bucketName;public static String END_POINT;public static String KEY_ID;public static String KEY_SECRET;public static String BUCKET_NAME;@Overridepublic void afterPropertiesSet() throws Exception {END_POINT = endPoint;KEY_ID = keyId;KEY_SECRET = keySecret;BUCKET_NAME = bucketName;} }

(2)創(chuàng)建 controler 和 service 類

我們是先創(chuàng)建了一個(gè) service 接口,再創(chuàng)建了它的一個(gè)實(shí)現(xiàn)類,

controller中的注入可以注入接口,也可以注入具體的實(shí)現(xiàn)類。(當(dāng)有多個(gè)實(shí)現(xiàn)類時(shí)只能注入實(shí)現(xiàn)類,否則會(huì)報(bào)錯(cuò)有多個(gè) bean 是 OssService 類型):

@Autowired private OssService ossService;

但是接口中只定義了方法:

public interface OssService {String uploadAvatar(MultipartFile file); }

真正實(shí)現(xiàn)以及 @Service 注解都是在實(shí)現(xiàn)類上:

@Service public class OssServiceImpl implements OssService {@Overridepublic String uploadAvatar(MultipartFile file) {String endPoint = ConstantPropertiesUtil.END_POINT;String bucketName = ConstantPropertiesUtil.BUCKET_NAME;String keyId = ConstantPropertiesUtil.KEY_ID;String keySecret = ConstantPropertiesUtil.KEY_SECRET;// 創(chuàng)建OSSClient實(shí)例。OSS ossClient = new OSSClientBuilder().build(endPoint, keyId, keySecret);try {ossClient.putObject(bucketName, file.getOriginalFilename(), file.getInputStream());// 關(guān)閉OSSClient。ossClient.shutdown();return "https://" + bucketName + "." + endPoint + "/" + file.getOriginalFilename();} catch (Exception e) {e.printStackTrace();return null;}} }

上述代碼會(huì)出現(xiàn)文件重名覆蓋的問(wèn)題,通過(guò)修改文件名解決文件重名覆蓋問(wèn)題,并按日期文件夾分類:

String fileName = file.getOriginalFilename(); //添加uuid防止文件重名 String uuid = UUID.randomUUID().toString().replaceAll("-", ""); fileName = uuid + fileName ; //添加日期,按日期創(chuàng)建文件夾對(duì)文件分類 String date = new DateTime().toString("yyyy/MM/dd"); fileName = date + "/" + fileName;

三. nginx 請(qǐng)求轉(zhuǎn)發(fā)

1. nginx 基礎(chǔ)概念

由于現(xiàn)在后端有兩個(gè)服務(wù)(eduservice 和 oss),一個(gè)在 8081,一個(gè) 8082 端口,那前端發(fā)送的請(qǐng)求如何被正確轉(zhuǎn)發(fā)到對(duì)應(yīng)端口呢?答案是使用 **nginx **。

nginx 能夠?qū)崿F(xiàn):

  • 請(qǐng)求轉(zhuǎn)發(fā)
  • 負(fù)載均衡
  • 動(dòng)靜分離(將靜態(tài)的代碼文件與動(dòng)態(tài)文件分開(kāi)存儲(chǔ))

  • 2. 實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)

    如何使用 nginx 實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)呢?

    (1)首先下載 ngnix for windows,然后修改其配置文件 …\nginx-1.18.0\conf\nginx .conf

    http {server {listen 9001; //修改監(jiān)聽(tīng)的端口號(hào)防止沖突server_name localhost;//添加需要轉(zhuǎn)發(fā)的請(qǐng)求地址:~ 表示正則匹配location ~ /eduservice/ {proxy_pass http://localhost:8081;}location ~ /oss/ {proxy_pass http://localhost:8082;}} }

    (2)修改前端端口號(hào)為 nginx 中配置的端口號(hào):

    (3)前端重新啟動(dòng),并啟動(dòng)后端兩個(gè)服務(wù)。再啟動(dòng) nginx 。注意啟動(dòng) nginx 前最好先 stop 掉它之前的進(jìn)程:

    nginx -s stop

    四. 頭像上傳前端代碼

    1. 導(dǎo)入上傳文件模塊

    確保 components 模塊下有這兩個(gè)模塊,沒(méi)有的話下載拷貝過(guò)來(lái)就行:

    前端代碼導(dǎo)入模塊:

    <script> //導(dǎo)入 import ImageCropper from '@/components/ImageCropper' import PanThumb from '@/components/PanThumb'export default {components: {ImageCropper, PanThumb} //聲明 }

    2. 頭像上傳組件

    <el-form-item label="頭像"><!--頭像縮略圖--><pan-thumb :image="teacherForm.avatar"/><el-button type="primary" icon="el-icon-upload" @click="imageUploadShow=true">更換頭像</el-button>//點(diǎn)擊上傳文件后調(diào)用的組件<image-cropperv-show="imageUploadShow":width="300":height="300":key="imageKey" //用于重新初始化組件:url="BASE_API + '/oss/fileupload/avatar'" //后端文件上傳的url地址field="file"@close="close"@crop-upload-success="cropSuccess" //上傳成功后調(diào)用的方法/> </el-form-item> data() {return {imageUploadShow: false,BASE_API: process.env.BASE_API, //從dev.env.js文件中讀取的內(nèi)容imageKey: 0,} },

    添加方法的定義:

    close() {this.imageUploadShow = falsethis.imageKey = this.imageKey + 1 //用于重新初始化組件,防止上次成功后第二次點(diǎn)擊上傳出現(xiàn)bug }, //這是上傳成功后調(diào)用的方法,自動(dòng)封裝data的內(nèi)容 cropSuccess(data) {this.imageUploadShow = falsethis.teacherForm.avatar = data.urlthis.imageKey = this.imageKey + 1 }

    五. EasyExcel的使用

    后續(xù)內(nèi)容要用到 EasyExcel,這里先介紹下如何使用EasyExcel進(jìn)行讀寫。

    1. 引入 pom 依賴

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

    注意:其實(shí)還需要引入 poi 依賴,前面已經(jīng)引入過(guò)了。

    2. 寫操作

    建立一個(gè)實(shí)體類,用 @ExcelProperty 注解標(biāo)識(shí)它在 excel 表中的列名

    @Data public class EasyExcelEntity {@ExcelProperty(value = "學(xué)生編號(hào)", index = 0)private Integer sno;@ExcelProperty(value = "學(xué)生姓名", index = 1)private String sname; }

    寫操作:

    String fileName = "D:\\stu.xlsx"; List<EasyExcelEntity> stuList = new ArrayList<>(); for (int i = 0; i < 10; i++) {EasyExcelEntity entity = new EasyExcelEntity();entity.setSno(i);entity.setSname("hi" + i);stuList.add(entity); } EasyExcel.write(fileName, EasyExcelEntity.class).sheet("學(xué)生列表").doWrite(stuList);

    3. 讀操作

    同樣需要上述一個(gè)實(shí)體類對(duì)應(yīng) excel 表中的列名,此外比 “寫操作” 更麻煩一點(diǎn)的是需要建立一個(gè)監(jiān)聽(tīng)器

    public class EasyExcelListener extends AnalysisEventListener<EasyExcelEntity> {//一行一行讀取代碼時(shí)進(jìn)行的操作@Overridepublic void invoke(EasyExcelEntity easyExcelEntity, AnalysisContext analysisContext) {System.out.println(easyExcelEntity.getSno() + ": " + easyExcelEntity.getSname());}//讀取完進(jìn)行的操作@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {} }

    讀操作:

    EasyExcel.read(fileName, EasyExcelEntity.class, new EasyExcelListener()).sheet().doRead();

    總結(jié)

    以上是生活随笔為你收集整理的Day6 - 头像存储与EasyExcel的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 少妇喷潮明星 | 久久人人插 | 久久久久人妻精品色欧美 | 日本黄频 | 免费成人深夜夜行网站视频 | 国产强伦人妻毛片 | 精品一区日韩 | 色婷网 | 久草麻豆 | 欧美精品在线一区二区 | 波多野av在线 | 天天射天天草 | 丝袜国产在线 | 日本人妖在线 | 国产四区| 亚洲精品一区 | 中文字幕免费观看视频 | 亚洲社区在线观看 | 午夜淫片| 一区二区三区黄色录像 | 日韩美女三级 | 色九九| 国产精九九网站漫画 | 精品国产av鲁一鲁一区 | 在线超碰av | 有码在线播放 | 国产欧美一区二区三区在线看蜜臂 | 国产精品无码久久久久高潮 | 天天色天天爱 | 青青草原在线免费观看视频 | 美腿丝袜亚洲综合 | 亚洲av首页在线 | 中文字幕在线视频免费播放 | 亚洲激情欧美激情 | 国产特级av | 国产69精品一区二区 | 国产精品自拍偷拍视频 | 好吊色综合| 日本久久免费 | 亚洲激情视频网站 | 亚洲综合中文 | 黑白配高清国语在线观看 | 你懂的网站在线观看 | 一级黄色短片 | 国产情侣av在线 | 欧美成人视屏 | 午夜不卡久久精品无码免费 | 国产av一区不卡 | 人人人超碰 | 99久久久国产精品免费蜜臀 | 免费看女生隐私 | 午夜激情久久久 | 九色国产在线 | 精品国产一区二区三区四区阿崩 | 成人免费毛片足控 | 日韩午夜视频在线 | 91在线免费视频观看 | 精品免费囯产一区二区三区 | 色综合久久久久无码专区 | 神马午夜91 | 亚洲国产精品99久久 | 久久久精品人妻一区二区三区 | 在线亚洲一区二区 | 91国在线 | 在线视频中文 | 少妇粉嫩小泬喷水视频www | 久久神马 | 伊人av影院 | 欧美性猛交xxxx乱大交俱乐部 | 久久二区三区 | 最色成人网 | 免费看91 | missav | 免费高清av在线看 | 精品无码一区二区三区爱欲 | 欧洲性生活片 | 欧美人与性囗牲恔配 | 黄色精品一区 | www欧美色 | 怡红院男人天堂 | 爱看av在线 | 中文字幕欧美在线观看 | 激情超碰 | 欧美偷拍一区二区三区 | 久久久久久久久久久综合 | 天堂网在线最新版www中文网 | 玖草视频在线观看 | 午夜精品久久久久久 | 欧美日韩视频免费观看 | 四虎中文字幕 | 91黄色在线视频 | 黄色网战入口 | 国产精品久久久999 www日本高清视频 | 欧美人性生活视频 | 五月99久久婷婷国产综合亚洲 | 中文字幕11页中文字幕11页 | 91超碰在线 | 最新国产精品自拍 | 男女啪动最猛动态图 | jjzz国产|