国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站建設(shè)教程app今日新聞事件

網(wǎng)站建設(shè)教程app,今日新聞事件,做網(wǎng)站公司yuanmus,現(xiàn)在手機(jī)網(wǎng)站用什么做的前言 如果你的前后端分離項(xiàng)目采用SpringBoot3Vue3Element Plus,且在沒有OSS(對象存儲)的情況下,使用mysql讀寫圖片(可能不限于圖片,待測試)。 耗時(shí)三天,在踩了無數(shù)雷后&#xff0c…

前言

如果你的前后端分離項(xiàng)目采用SpringBoot3+Vue3+Element Plus,且在沒有OSS(對象存儲)的情況下,使用mysql讀寫圖片(可能不限于圖片,待測試)。

耗時(shí)三天,在踩了無數(shù)雷后,終于完成本功能。為你呈上。

本文完成功能:

  1. 前端采用Element發(fā)起上傳圖片請求,后端接收并將其存儲到mysql。
  2. 后端相應(yīng)圖片base64數(shù)據(jù),前端接收并渲染到頁面。

1.前端上傳到數(shù)據(jù)庫

1.1前端上傳圖片

<el-form-item label="寵物照片" prop="pictureId">
<el-upload v-model="form.pictureId" :auto-upload="false" :action="''" :show-file-list="true" :on-change="handleAvatarChangeIcon"><el-button type="primary">選取文件</el-button>
</el-upload>
</el-form-item>

參數(shù):

:auto-upload 是否自動上傳

:action 自動上傳的請求路徑

:show-file-list 顯示已上傳的圖片列表

:on-change 選中文件觸發(fā)的change事件

自動上傳與否都不影響,這里主要是判斷一下圖片的大小、后綴名。如下:

const handleAvatarChangeIcon = (file) => {// 限制文件后綴名const isJPG = file.raw.type === 'image/jpeg'const isPNG = file.raw.type === 'image/png'// 限制上傳文件的大小const isLt5M = file.raw.size / 1024 / 1024 < 5if (!isPNG && !isJPG) {ElMessage.error('圖片只能是 JPG/PNG 格式')return false} else if (!isLt5M) {ElMessage.error('圖片應(yīng)在5MB以內(nèi)')return false} else {// 發(fā)起請求let param = new FormData();// 文件為form data格式param.append("file", file.raw);post('/api/file/upload', param, (res) => {ElMessage.success('上傳成功');// 返回值為圖片idform.pictureId = res})}
}

1.2后端接收并保存數(shù)據(jù)庫

controller

@RestController
@RequestMapping("/api/file")
public class FileController {@Resourceprivate FileService fileService;@PostMapping("/upload")public RestBean<String> upload(@RequestParam MultipartFile file) {Integer res = fileService.upload(file);return RestBean.success(String.valueOf(res));}
}

serviceImpl

@Service
public class FileServiceImpl implements FileService {@Resourceprivate FileMapper fileMapper;/*** 文件上傳到數(shù)據(jù)庫*/@Overridepublic Integer upload(MultipartFile file) throws IOException {// 獲取文件原始名String originalFilename = file.getOriginalFilename();// 獲取文件后綴名String endName = "png";if (originalFilename != null) {endName = originalFilename.substring(originalFilename.lastIndexOf("."));}// 拼接文件名String filename = UUID.randomUUID() + endName;Integer pictureId;// 創(chuàng)建圖片對象byte[] fileBytes = file.getBytes();Picture picture = new Picture();picture.setName(filename);picture.setPicData(fileBytes);// 上傳數(shù)據(jù)庫fileMapper.upload(picture);pictureId = picture.getId();// 返回圖片idreturn pictureId;}
}

mapper.xml

<mapper namespace="com.ycb.mapper.FileMapper"><insert id="upload" useGeneratedKeys="true" keyProperty="id">insert into `pet-adoption`.picture(name, pic_data)value (#{name}, #{picData})</insert>
</mapper>

數(shù)據(jù)庫設(shè)計(jì)

在這里插入圖片描述

2.前端從數(shù)據(jù)庫獲取圖片并渲染

2.1后端從數(shù)據(jù)庫中獲取

entity

public class PetAndBulVO {/*** 照片*/private byte[] picData;
}

controller

如果是一個圖片數(shù)據(jù)直接封裝到實(shí)體類,很多數(shù)據(jù)就封裝成集合

@RequestMapping("/api/pet")
public class PetController {@Resourceprivate PetService petService;@GetMapping("/getAllPB")public RestBean<List<PetAndBulVO>> getAll() {List<PetAndBulVO> pets = petService.getAll();return RestBean.success(pets);}
}

serviceImpl

@Service
public class PetServiceImpl implements PetService {@Resourceprivate PetMapper petMapper;@Overridepublic List<PetAndBulVO> getAll() {return petMapper.getAll();}
}

mapper.xml

<mapper namespace="com.ycb.mapper.PetMapper"><!--  一定要映射結(jié)果集  --><resultMap type="com.ycb.entity.vo.response.PetAndBulVO" id="petAndBulVO"><id column="pic_data" property="picData" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler"/></resultMap><select id="getAll" resultMap="petAndBulVO">select *from `pet-adoption`.pet petjoin `pet-adoption`.picture p on p.id = pet.picture_id</select>

后端返回的圖片數(shù)據(jù)如下:

在這里插入圖片描述

2.2前端接收數(shù)據(jù)并渲染

后端傳來的數(shù)據(jù)是 base64 形式的,需要解碼

// 解碼
const base64ToUrl = (base64) => {return 'data:image/png;base64,' + base64
}// 獲取數(shù)據(jù)
get('/api/pet/getAllPB', (data) => {for (let i = 0; i < data.length; i++) {data[i].picData = base64ToUrl(data[i].picData)}pBList.value = data
}, (err) => {ElMessage.error(err)
})

解碼后的圖片數(shù)據(jù)如下:

在這里插入圖片描述

渲染是大坑!一定要 v-bind: 綁定 src

// v-for循環(huán)獲取picData, v-for="(pb) in pBList"
<el-image v-bind:src="pb.picData"/>

《林克可愛圖》
在這里插入圖片描述

寫在最后

雖然可以實(shí)現(xiàn)僅用mysql就能完成圖片讀寫,但其性能堪憂。

很難,但貴在堅(jiān)持。

http://m.aloenet.com.cn/news/36706.html

相關(guān)文章:

  • 沒有網(wǎng)站怎么做淘寶客seo優(yōu)化技術(shù)培訓(xùn)
  • 大冶建設(shè)局網(wǎng)站優(yōu)化設(shè)計(jì)六年級上冊語文答案
  • 怎么不花錢做網(wǎng)站專業(yè)營銷推廣團(tuán)隊(duì)
  • 杭州亞運(yùn)會閉幕式安卓手機(jī)優(yōu)化大師官方下載
  • 鼎湖網(wǎng)站建設(shè)啥都能看的瀏覽器
  • 杭州微網(wǎng)站開發(fā)先做后付費(fèi)的代運(yùn)營
  • 中視頻自媒體平臺注冊seo中心
  • 廈門外貿(mào)商城網(wǎng)站建設(shè)seo運(yùn)營做什么
  • 網(wǎng)站地圖怎么做XML網(wǎng)站網(wǎng)上推廣
  • 網(wǎng)站開發(fā)建設(shè)方案書嵌入式培訓(xùn)
  • jsp網(wǎng)站開發(fā)教學(xué)上海培訓(xùn)機(jī)構(gòu)有哪些
  • 通遼網(wǎng)站建設(shè)公司百度移動點(diǎn)擊排名軟件
  • 做網(wǎng)站的工資高嗎?谷歌商店paypal下載官網(wǎng)
  • 線切割加工東莞網(wǎng)站建設(shè)技術(shù)支持百度業(yè)務(wù)范圍
  • 書簽制作手工搜索引擎優(yōu)化工作
  • 網(wǎng)站怎么做站內(nèi)美化代運(yùn)營公司哪家好一些
  • 凡科網(wǎng)之前做的網(wǎng)站在哪看寧波seo整站優(yōu)化
  • 網(wǎng)站建設(shè)unohacha傳播易廣告投放平臺
  • 企業(yè)網(wǎng)站建設(shè)設(shè)計(jì)需要什么網(wǎng)站seo公司哪家好
  • 做視頻網(wǎng)站如何賺錢企業(yè)網(wǎng)站設(shè)計(jì)思路
  • 普斯泰網(wǎng)站建設(shè)百度搜索指數(shù)和資訊指數(shù)
  • 網(wǎng)站描述標(biāo)簽怎么寫技術(shù)培訓(xùn)學(xué)校機(jī)構(gòu)
  • 網(wǎng)站建設(shè)要程序員嗎直接下載app
  • 太原視頻剪輯培訓(xùn)機(jī)構(gòu)哪個好上海關(guān)鍵詞優(yōu)化外包
  • wordpress全站美化東莞網(wǎng)絡(luò)優(yōu)化公司
  • 網(wǎng)站開發(fā)和軟件開發(fā)有什么區(qū)別2022新聞大事件摘抄
  • 網(wǎng)站建設(shè)漠環(huán)熊掌號濟(jì)源網(wǎng)絡(luò)推廣
  • 研究生院 網(wǎng)站 建設(shè)新的營銷模式有哪些
  • 廣告行業(yè)網(wǎng)站建設(shè)方案網(wǎng)站優(yōu)化塔山雙喜
  • 網(wǎng)站正在建設(shè)中頁面深圳營銷推廣公司