最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS實現(xiàn)將圖片轉(zhuǎn)為base64格式

 更新時間:2023年07月20日 09:41:34   作者:嗯嗯呢  
Base64是一種用64個字符來表示任意二進(jìn)制數(shù)據(jù)的方法,這篇文章主要為大家介紹了如何實現(xiàn)將圖片轉(zhuǎn)為base64格式,感興趣的小伙伴可以學(xué)習(xí)一下

前言

前段時間在寫我的VUE全棧項目的時候,遇到要把前端的照片上傳到后端,再由后端存到數(shù)據(jù)庫的問題,通過網(wǎng)上查找資料,看了一些其他寫者的解決方法,最終采用轉(zhuǎn)BASE64的方法。本人覺得把上傳的圖片轉(zhuǎn)為BASE64格式相比其他是比較簡單的。

什么是BASE64

Base64是一種用64個字符來表示任意二進(jìn)制數(shù)據(jù)的方法。它是一種編碼方式,而非加密方式,即可以將一張圖片數(shù)據(jù)編碼成一串字符串,使用該字符串代替圖像地址。

BASE64的優(yōu)缺點(diǎn)

優(yōu)點(diǎn): 減少一張圖片的http請求

缺點(diǎn): 導(dǎo)致轉(zhuǎn)換后的css文件體積增大,而CSS 文件的體積直接影響渲染,導(dǎo)致用戶會長時間注視空白屏幕,而且轉(zhuǎn)換后的數(shù)據(jù)是一大串字符串。

注意:圖片轉(zhuǎn)BASE64格式的適合小圖片或者極簡單圖片,大圖片不劃算。它的格式為:data:image/type;base64,xxxx...

雖然說這種方式不適用于體積大的圖片,但不得不說有時候還挺方便的。由于在我的vue項目中上傳的圖片都比較小,單一,為了方便我采用了這種方式來實現(xiàn)將前端上傳的圖片存到數(shù)據(jù)庫中。

話不多說,進(jìn)入正題!下面以Vue+Koa框架、數(shù)據(jù)庫為MYSQL為例。

案例

前端: 首先在把圖片傳給后端之前,前端對圖片進(jìn)行格式轉(zhuǎn)換,轉(zhuǎn)換成功后就可以照常調(diào)用后端給的接口,傳進(jìn)去就行。

我這里就是點(diǎn)了提交按鈕后,觸發(fā)編寫的點(diǎn)擊事件函數(shù),在函數(shù)里先對圖片轉(zhuǎn)base64,轉(zhuǎn)成功后再調(diào)用后端給的接口,把此數(shù)據(jù)以及其他數(shù)據(jù)傳進(jìn)去就行。

在前端編寫轉(zhuǎn)base64的函數(shù)(很重要)

export function uploadImgToBase64 (file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()//html5提供的一種異步文件讀取機(jī)制 
    reader.readAsDataURL(file)//將文件讀取為Base64編碼的數(shù)據(jù)URL
    reader.onload = function () {  // 圖片轉(zhuǎn)base64完成后返回reader對象
      resolve(reader)
    }
    reader.onerror = reject
  })
}

前端要為轉(zhuǎn)為base64的圖片的相應(yīng)操作

const state = reactive({
    picture: [] //這個是用來裝表單里選中的照片
})


      const imgBroadcastListBase64 = [] //用來存放轉(zhuǎn)base64后的照片,用數(shù)組是因為上傳的圖片可能不止一張
      console.log('圖片轉(zhuǎn)base64開始...')
      // 遍歷每張圖片picture 異步
      const filePromises = state.picture.map(async file => {
        //console.log(file);
        const response = await uploadImgToBase64(file.file) //調(diào)用函數(shù) 將圖片轉(zhuǎn)為base64
        //console.log(response,111);
        return response.result.replace(/.*;base64,/, '')  // 去掉data:image/jpeg;base64,
      })
      // 按次序輸出 base64圖片
      for (const textPromise of filePromises) {
        imgBroadcastListBase64.push(await textPromise)
      }
      console.log('圖片轉(zhuǎn)base64結(jié)束..., ', imgBroadcastListBase64)
      
      
      //判斷imgBroadcastListBase64是否<=1,是的話就是上傳一張圖片,否則上傳的是多張圖片
      if(imgBroadcastListBase64.length<=1){
      state.imgsStr = imgBroadcastListBase64.join()//轉(zhuǎn)字符串
      }else{
      state.imgsStr = imgBroadcastListBase64.join(',')//轉(zhuǎn)字符串并且每個值用','拼接,這樣是為了方便后面從數(shù)據(jù)庫拿到數(shù)據(jù),將圖片又轉(zhuǎn)為之前的base64格式
      }
      //調(diào)用后端提供的接口,傳數(shù)據(jù)到數(shù)據(jù)庫里(這個只是自己編寫的后端接口,主要是為了展示傳數(shù)據(jù))
       const res = await secondGoodsAdd({
          create_time: ti,
          content_goods: state.content,
          color: state.title2,
          price: state.title3,
          tel: state.title4,
          img: state.imgsStr,//轉(zhuǎn)base64后的圖片
          concat_num: 0,
          like_num: 0,
          name_goods: state.title1
        })
         if (res.code === '80000') {
          showSuccessToast('發(fā)布成功!')
        }
        router.push('/cicle')

存到數(shù)據(jù)庫中的圖片路徑是轉(zhuǎn)為base64后的且刪除前面data:image/jpeg;base64的字符串。

這樣數(shù)據(jù)就存到數(shù)據(jù)庫中啦!存進(jìn)去的是字符串。

那么問題來了,數(shù)據(jù)是存進(jìn)去了,但是我又想拿到這個數(shù)據(jù)到前端顯示出來,好,那我就先直接拿到前端用,結(jié)果發(fā)現(xiàn)報錯了!說是請求頭太長?想辦法解決下!后面我的解決辦法是拿到這個轉(zhuǎn)為了base64且去掉前面data...字段的的圖片數(shù)據(jù)再轉(zhuǎn)為正常的base64的格式。好,來轉(zhuǎn)換吧!

//我這里是在后端編寫的接口,用于展示被添加到數(shù)據(jù)庫中的所有數(shù)據(jù)
router.get('/cirleLifeLook',async(ctx,next)=>{
  try {
    const result=await userService.cirleLifeLook()
    for(let i=0;i<result.length;i++){
      var imgData=result[i].img //獲取每條數(shù)據(jù)中的照片字段
      if(imgData){
        if(imgData.indexOf(',')>-1){//存在','的話代表是多張圖片的混合的字符串
          let ans=imgData.split(',') //切割 獲得多張之前切掉data...后的base64字符串
          let s=[]
          for(let j=0;j<ans.length;j++){
            s.push("data:image/png;base64,"+ans[j])//還原每張圖片初始的base64數(shù)據(jù)
          }  
          result[i].img=s
        }else{
          result[i].img="data:image/png;base64,"+imgData //就一張圖片直接在前面拼接"data:image/png;base64,"
        }
      }
    }//到此為止,在給前端傳數(shù)據(jù)前就修改了其中每條數(shù)據(jù)里的照片地址,這樣就可以正常顯示啦
    if(result.length){
      ctx.body={
        code:'80000',
        data:result,
        msg:'獲取成功'
      }
    }else{
      ctx.body={
        code:'80005',
        data:'null',
        msg:'還沒有信息'
      }
    }
  } catch (error) {
    ctx.body={
      code:'80002',
      data:error,
      msg:'服務(wù)器異常'
    }
  }
})

OK,到此就結(jié)束啦~現(xiàn)在是不是覺得把圖片轉(zhuǎn)base64還是挺簡單的?還挺有用的?快去實踐下吧。記住此方法只適合小圖片類型的,大點(diǎn)的文件可能會崩掉哈!

到此這篇關(guān)于JS實現(xiàn)將圖片轉(zhuǎn)為base64格式的文章就介紹到這了,更多相關(guān)JS圖片轉(zhuǎn)base64內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript中的五種基本數(shù)據(jù)類型

    javascript中的五種基本數(shù)據(jù)類型

    在javascript中申明變量使用的關(guān)鍵字都是var,這點(diǎn)與其他的編程語言不盡相同,但是javascript亦含有五種基本的數(shù)據(jù)類型(也可以說是簡單數(shù)據(jù)類型),它們分別是:Undefined,Null,Boolean,Number和String。還含有一種復(fù)雜數(shù)據(jù)類型—Object。這里我們不談復(fù)雜數(shù)據(jù)類型
    2015-08-08
  • input 標(biāo)簽實現(xiàn)輸入框帶提示文字效果(兩種方法)

    input 標(biāo)簽實現(xiàn)輸入框帶提示文字效果(兩種方法)

    這篇文章主要介紹了input 標(biāo)簽實現(xiàn)輸入框帶提示文字效果(兩種方法),需要的朋友可以參考下
    2017-10-10
  • JS調(diào)用某段SQL語句的方法

    JS調(diào)用某段SQL語句的方法

    這篇文章主要為大家詳細(xì)介紹了通過JS調(diào)用某段SQL語句的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • js中confirm實現(xiàn)執(zhí)行操作前彈出確認(rèn)框的方法

    js中confirm實現(xiàn)執(zhí)行操作前彈出確認(rèn)框的方法

    這篇文章主要介紹了js中confirm實現(xiàn)執(zhí)行操作前彈出確認(rèn)框的方法,是執(zhí)行刪除等操作時常用的功能,非常具有實用價值,需要的朋友可以參考下
    2014-11-11
  • checkbox全選所涉及到的知識點(diǎn)介紹

    checkbox全選所涉及到的知識點(diǎn)介紹

    checkbox全選涉及到的知識點(diǎn)比如IE里起作用,火狐不起作用,getElementById()與getElementsByName()的區(qū)別等等
    2013-12-12
  • ES6入門教程之Array.from()方法

    ES6入門教程之Array.from()方法

    這篇文章主要給大家介紹了關(guān)于ES6入門教程之Array.from()方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ES6具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • js/ajax跨越訪問-jsonp的原理和實例(javascript和jquery實現(xiàn)代碼)

    js/ajax跨越訪問-jsonp的原理和實例(javascript和jquery實現(xiàn)代碼)

    最近做了一個項目,需要用子域名調(diào)用主域名下的一個現(xiàn)有的功能,于是想到了用jsonp來解決,在我們平常的項目中不乏有這種需求的朋友,于是記錄下來以便以后查閱同時也希望能幫到大家,需要了解的朋友可以參考下
    2012-12-12
  • JavaScript設(shè)計模式之抽象工廠模式介紹

    JavaScript設(shè)計模式之抽象工廠模式介紹

    這篇文章主要介紹了JavaScript設(shè)計模式之抽象工廠模式介紹,抽象工廠模式就是對功能類單獨(dú)創(chuàng)建工廠類,這樣就不必修改之前的代碼,又?jǐn)U展了功能,需要的朋友可以參考下
    2014-12-12
  • javaScript基礎(chǔ)詳解

    javaScript基礎(chǔ)詳解

    本文主要介紹了javaScript的基礎(chǔ)知識,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • ESC之ESC.wsf可以實現(xiàn)javascript的代碼壓縮附使用方法

    ESC之ESC.wsf可以實現(xiàn)javascript的代碼壓縮附使用方法

    可以對javascript的大小進(jìn)行壓縮。使javascript的加載速度變快。
    2007-05-05

最新評論

成都市| 靖边县| 德江县| 高平市| 务川| 南丰县| 东乡族自治县| 太仆寺旗| 香格里拉县| 平潭县| 大理市| 叶城县| 黑山县| 莲花县| 大安市| 福海县| 泊头市| 石阡县| 库车县| 正宁县| 富蕴县| 广汉市| 玉龙| 桃江县| 齐齐哈尔市| 无为县| 绩溪县| 台山市| 铜陵市| 连平县| 宁河县| 广水市| 大荔县| 卢龙县| 岳阳市| 银川市| 红原县| 犍为县| 桃园市| 景德镇市| 锦屏县|