整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          10行JavaScript代碼完成圖片的上傳預覽

          擊右上方紅色按鈕關注“web秀”,讓你真正秀起來

          前言

          冬至,希望大家都可以有餃子和湯圓吃,主要是能和自己家人愛人一起吃個飯。

          下面進入主題,用原生JS給擼個圖片上傳,預覽的小示例,希望對大家有所幫助。

          示例

          function fChange() { 
           let file = document.getElementById('file'); 
           // 輸出已經選擇圖片名字 
           console.log(file.value); 
           // 輸出已經選擇的圖片對象 
           console.log(file.files[0]); 
          } 
          ... 
          <input type="file" id="file" onchange="fChange()">
          

          10行JavaScript代碼完成圖片的上傳預覽

          我們怎么把圖片對象渲染到頁面了?達到可以預覽的目的?

          // file 轉 blob對象 
          let bold = window.URL.createObjectURL(file.files[0]); 
          console.log('bold==>'+bold); 
           
          let boldImg = document.getElementById('bold'); 
          boldImg.src = bold; 
           
          // file 轉 base64 
          let base64Img = document.getElementById('base64'); 
          var reader = new FileReader(); 
          reader.readAsDataURL(file.files[0]); 
          reader.onload = function (e) { 
           console.log('base64==>'+this.result); 
           base64Img.src = this.result; 
          }
          

          10行JavaScript代碼完成圖片的上傳預覽

          10行JavaScript代碼完成圖片的上傳預覽

          這樣看blob對象和base64都可以預覽圖片,但是blob對象僅僅是當次緩存,如果刷新,你重新把之前轉的字符串放到src是不可以預覽的,當時base64是可以的。所以存庫的時候不僅可以圖片路徑,還可以直接存base64(base64很占用數據庫空間,文件越大,base64字符串越大)

          優化

          下面我們對上面示例做優化,可以上傳多張圖片并預覽,美化界面。

          10行JavaScript代碼完成圖片的上傳預覽

          10行JavaScript代碼完成圖片的上傳預覽

          <div id="img-pre"> 
          </div> 
          <div id="add-pic"> 
           <input type="file" id="up-file" onchange="fChange()"> 
          </div>
          

          css樣式

          #add-pic{ 
           width: 100px; 
           height: 100px; 
           background: url('./add-pic.png') 
          } 
          #add-pic input{ 
           width: 100%; 
           height: 100%; 
           display: none; 
          } 
          #img-pre:after{ 
           display: block; 
           content: ''; 
           clear: both; 
          } 
          #img-pre img{ 
           float: left; 
           width: 100px; 
           height: 100px; 
           margin-right: 10px; 
          }
          

          javascript

          let addPic = document.getElementById('add-pic'), upFile = document.getElementById('up-file'); 
          // 監聽圖片點擊,從而觸發input file的點擊事件 
          addPic.addEventListener('click', function(){ 
           upFile.click(); 
          }) 
          function fChange() { 
           let file = document.getElementById('up-file'); 
           let imgPre = document.getElementById('img-pre'); 
           
           // file 轉 blob對象 
           let bold = window.URL.createObjectURL(file.files[0]); 
           
           // 創建img元素,并添加到img-pre元素里 
           var img = document.createElement("img"); 
           img.setAttribute("src", bold); 
           imgPre.appendChild(img); 
          }
          

          主要是通過css隱藏掉input file選擇文件按鈕,然后用+號圖片點擊事件來觸發input file的點擊事件,達到能選擇圖片的目的。

          公告

          喜歡小編的點擊關注,了解更多知識!

          源碼地址請點擊下方“了解更多”

          .什么是文本和圖像鏈接!

          瀏覽網頁時,會看到一些帶下劃線的文字。,將光標移到文字上時,光標將變成手形,單擊會打開一個網頁,這樣的鏈接就是文本鏈接。

          在網頁中瀏覽內容時,若將光標移到圖像上,光標會變成手形,單擊會打開一個網頁,這樣的鏈接就是圖像鏈接。

          文本鏈接

          圖像鏈接

          2.創建鏈接的方法!

          使用<a>標簽可以實現網頁超鏈接,但<a>標簽需要定義錨來指定鏈接目標。錨(anchor)有兩種用法,介紹如下:

          (1)通過使用href屬性,創建指向另外一個文檔的鏈接(或超鏈接);

          (2)通過使用name和id屬性,創建一個文檔內部的書簽(也就是說,可以創建指向文檔片段的鏈接)。

          使用href屬性的代碼格式如下:

          <a href="鏈接地址">創建鏈接的文本或圖片</a>

          使用name屬性的代碼格式如下:

          <a name="value">創建鏈接的文本或圖片</a>

          name屬性用于指定錨(anchor)的名稱,可以創建(大型)文檔內的書簽。

          使用id屬性的代碼格式如下:

          <a id="value">創建鏈接的文本或圖片</a>

          3.創建網頁內的文本鏈接!

          創建網頁內的文本鏈接主要使用href屬性來實現,如在網頁中做一些知名網站的友情鏈接,具體操作方法如下。

          (1)編寫代碼如下圖所示:

          (2)在瀏覽器中打開文件,預覽效果如下所示,可以看到帶有超鏈接的文本呈現淺紫色。

          小提示:鏈接地址前的“http:// ”不可省略,否則會出現錯誤提示。

          4.創建網站內的圖像鏈接!

          使用<a>標簽為圖片添加鏈接的代碼格式如下:

          <a href="鏈接目標l"><img src="圖片"/></a>

          下面是一個簡單的圖片鏈接案例。

          (1)編寫代碼如下圖所示:

          (2)在瀏覽器中打開文件,預覽效果如下所示。光標放在圖片上呈現抓手形,單擊后可跳轉到指定網頁。

          瀏覽器截圖


          小提示:文件中的圖片要和當前網頁文件在同一個目錄下,鏈接的網頁沒有加“http:// ”,默認為當前網頁所在目錄。

          以下網頁有102個圖標,如何一次性爬???

          http://www.pp3.cn/icon/size/16_16/2011/1128/831.html

          試試以下小程序:

          import re
          import urllib.request
          import os
                                      #1 抓取網頁(網頁上有圖片地址)
          url = 'http://www.pp3.cn/icon/size/qita/2011/1128/758.html'
          req = urllib.request.urlopen(url)
          buf = req.read()
          req.close()
                                      #2 獲取圖片地址
          # 下面4句截取url的前半截,如http://www.pp3.cn(一些圖片是相對地址)
          i = url.find("/",9) 
          url0 = url
          if i > 0 :
              url0 = url[:i]  
          buf = buf.decode('gb2312')              # 有些網頁編碼是utf-8,要一致
          listurl = re.findall(r'img src=.[^\'\"]+\.png',buf)
          
          for i in range(len(listurl)):           # 把字符img src="去掉
              listurl[i]=listurl[i].replace('img src="',"")
              if not re.match("http",listurl[i]): # 如果是相對地址,加上上面提取的基地址
                  listurl[i]=url0 + listurl[i]
              print(listurl[i])                   # 將圖片地址列表打印一下
              
                                      #3 抓取圖片并保存到本地
          fpath = "D:\\pic2\\"
          if not os.path.isdir(fpath):
              os.mkdir(fpath)
          i = 0
          for url in listurl:
              f=open(fpath + str(i)+'.png','wb')
              req = urllib.request.urlopen(url)
              buf = req.read()
              f.write(buf)
              f.close()
              i+=1

          有四個關鍵點:

          1 網頁的編碼:有的是GB2312,有的是utf-8。

          2 有的網站服務器做了反爬蟲設置,需要寫較復雜的代碼來繞過。

          3 圖片網址正則表達式的設置。如上述的

          r'img src=.[^\'\"]+\.png'

          圖片的HTML的寫法:

          img src='http//…/picPath/…/.png'
          img src='http//…/picPath/…/.jpg'
          img src="http//…/picPath/…/.jpg"
          img src="picPath/…/.jpg"

          要通過適當的正則表達式來構建上述字符串表示規律。

          3.1 圓點“.”表示除'\n'以外的任意字符。上述可以表示單引號或雙引號,如果沒有其它字符,如在引用前還有一個字符,可多寫一個圓點.。

          3.2 “[^\'\"]+”表示一串除了單引號或雙引號以外的任意數量的其它字符。直到遇到“\.png”為止(可能出現貪婪匹配)?!癧]”表示列舉,“^”表示非,排除后面緊跟的字符;“\”表示轉義,轉義是指轉變原本的含義,單引號和雙引號原本是用來界定字符的,用轉義符來放棄這個用途,用做普通字符。加號“+”表示一個或多個前面的字符表示。

          3.3 "\.png"表示圓點.和圖片的類型png。

          上面說到貪婪匹配,要設置為非貪婪匹配,用小括號分組加一個問號即可:

          reg = r'img src=.([^\'\"]+\.png)?'

          如果出現問題,可以相看原網頁的圖片地址編寫格式及規律,簡單化處理。

          如圖片地址都有如下規律,

          http://www.pp3.cn/uploads/allimg/111128/1-11112…….png

          可將正則表達式簡單寫為:

          http://www.pp3.cn/uploads/allimg/111128/1-11112\S*.png

          “/S*”表示任意數量非空白字符。

          如果有多個網頁,可以將上述代碼寫成函數形式,循環調用:

          import re                     # 正則表達式
          import urllib.request         # 從服務器請求返回資源
          import os                     # 文件和目錄操作
          import socket                 # 套接字操作
          #socket.setdefaulttimeout(20) # 設置socket層的超時時間為20秒
          def gethtml(url):                                               #1 抓取網頁html內容
              with urllib.request.urlopen(url) as req:
                  buf = req.read()
                  return buf
          def getImg(buf,codec,fpath,rege):                               #2 從html篩選圖片地址到list
          # 下面4句截取url的前半截,如http://www.pp3.cn(一些圖片是相對地址)
              i = url.find("/",9)
              url0 = url
              if i > 0 :
                  url0 = url[:i]
                  
              buf = buf.decode(codec)
              listurl = re.findall(reg,buf) #reg是正則表達式
              print("準備下載圖片數量:",len(listurl))
              for i in range(len(listurl)):                
                  #listurl[i]=listurl[i].replace('img src="',"") # 把字符img src="去掉
                  if not re.match("http",listurl[i]):
                      listurl[i]=url0 + listurl[i]
                  print(listurl[i])
                                                                           #3 抓取圖片并保存到本地
              if not os.path.isdir(fpath):
                  os.mkdir(fpath)
              i = 0
              '''
              for imgurl in listurl:
                  urllib.request.urlretrieve(imgurl,fpath + str(i)+'.jpg')
                  i+=1
              '''#下面的操作方式要快一點
              for imgurl in listurl:
                  f=open(fpath + str(i)+'.jpg','wb')      # 新建空白圖片文件
                  req = urllib.request.urlopen(imgurl)    # 獲取網頁圖片文件
                  buf = req.read()                        # 讀取網站上圖片文件內容
                  f.write(buf)                            # 將網站上圖片內容寫入新建的圖片文件
                  f.close()
                  i+=1
          # 四處內容需要確認:1 網頁url;                   2 網頁編碼UTF-8或gb2312;
          #                   3 圖片擴展名jpg或png(兩處); 4 保存的文件夾
          
          codec = 'gb2312'
          reg = r'img src=.([^\'\"]+\.png)?'
          webpages = ['http://www.pp3.cn/icon/size/qita/2011/1128/758.html', # 需提取圖片的網址可寫到列表內
                      'http://www.pp3.cn/icon/size/32_32/2011/1128/768.html'
                      ]
          i = 0
          for url in webpages:
              buf = gethtml(url)
              fpath = "D:\\" + str(i) +"\\"
              print(getImg(buf,codec,fpath,reg))  	 # 函數循環調用
              i+=1
              
          url = 'http://culture.ifeng.com/c/7vm9bFrvQpl'
          codec = 'utf-8'
          buf = gethtml(url)
          reg = r'img src=..([^\'\"]+\.jpeg)?'
          fpath = 'D:\\A\\'
          print(getImg(buf,codec,fpath,reg))  	    	 # 函數單獨調用
          

          圖片格式不同的較靈活的寫法:

          
          import re
          import urllib.request
          import os
          from itertools import islice  # 跳過可迭代對象的開始部分
          
          # fpath = "D:\\pic2\\"
          # 分析網頁文本、提到圖片超鏈接到list,逐一將list項保存到圖片文件
          # ① 要注意網頁的字符編碼,可在網頁查看
          
          # ② 要注意網站圖片的url格式規律
          # ③ 要注意圖片的擴展名
          
          # ④ 一次老是抓取不成功,原因是第三張無法打開,后跳過
          
          
          #"""
          # 1 獲取網頁文本
          
          url = 'http://www.pp3.cn/icon/size/16_16/2011/1128/831.html'
          #url = 'http://www.pp3.cn/icon/size/16_16/2011/1128/835.html'
          # 1.1 url沒加header的寫法
          
          
          req = urllib.request.urlopen(url)
          buf = req.read()
          req.close()
          
          
          # 1.2 在urllib中添加headers不同的寫法,需要headers是字典或元組
          """
          headers = {  # 如有反爬,可添加網頁自己的header
              'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
              }
          req  = urllib.request.Request(url=url,headers=headers)
          file = urllib.request.urlopen(req)
          buf  = file.read()
          """
          #2 多網頁文本中解析出圖片地址
          i = url.find("/",9) # 本句及下面三句截取url的前半截
          url2 = url
          if i > 0 :
              url2 = url[:i]
          #buf = buf.decode('UTF-8')
          buf = buf.decode('gb2312')
          #picType = '.jpg'
          #picType = '.jpeg'
          picType = '.png'
          #picType = '.gif'
          #listurl = re.findall(r'http:.[^"]+\.jpg',buf)
          if picType == '.jpg' :
              listurl = re.findall(r'img src=.([^\"^\']+\.jpg)?',buf)
          if picType == '.jpeg' :
              listurl = re.findall(r'img src=.([^\"^\']+\.jpeg)?',buf)
          if picType == '.png' :
              listurl = re.findall(r'img src=.([^\"^\']+\.png)?',buf)
          if picType == '.gif' :
              listurl = re.findall(r'img src=.([^\"^\']+\.gif)?',buf)
          for i in range(len(listurl)):     # 把字符img src="去掉
              listurl[i]=listurl[i].replace('img src="',"")
              if not re.match("http",listurl[i]):
                  listurl[i]=url2 + listurl[i]
              print(listurl[i])
          #"""
              
          
          """
          #  已知圖片url,只是序號不同
          listurl = []
          strs = "http://www.graphiscnn.com/evahbcms/upload/image/196/00"
          for x in range(2,55):
              listurl.insert(x,strs+str(x)+".jpg")
          """
              
          
          #3 抓取圖片并保存到本地
          i = 1
          fpath = "D:\\pic3\\"
          if not os.path.isdir(fpath):
              os.mkdir(fpath)
          #for url in listurl: # 列表的第三張無法打開,導致失敗
          for url in islice(listurl, 4, None): 
              f=open(fpath + str(i)+picType,'wb')
              req = urllib.request.urlopen(url)
              buf = req.read()
              f.write(buf)
              print(i,picType)
              f.close()
              i+=1
          
          """
          # UnicodeEncodeError: 'UCS-2' codec can't encode characters
          # in position 73-73: Non-BMP character not supported in Tk
          # 爬取的HTML頁面中包含了Unicode下無法識別的字符,添加標識為①-③的三行代碼
          import requests
          import sys  # ①
          non_bmp_map = dict.fromkeys(range(0x10000,sys.maxunicode + 1),0xfffd) # ②
          
          url = 'https://p.51vv.com/vp/kws2X4IT'
          html = requests.get(url,headers=headers)
          print(html.request.headers)
          html = str(html.text).translate(non_bmp_map)  # ③
          print(html)
          """

          運行:

          提取到的圖片:

          End


          主站蜘蛛池模板: 国产日韩精品一区二区三区在线 | 久久se精品动漫一区二区三区| 精品少妇人妻AV一区二区 | 自慰无码一区二区三区| 女人和拘做受全程看视频日本综合a一区二区视频 | 国产av天堂一区二区三区| 国产一区二区三区在线观看免费| 亚无码乱人伦一区二区| 一区二区三区四区在线播放 | 天堂国产一区二区三区| 亚洲AV综合色一区二区三区| 日韩一区二区三区免费体验| 国产MD视频一区二区三区| 久久99久久无码毛片一区二区| 福利视频一区二区牛牛| 丰满人妻一区二区三区免费视频| 日本在线不卡一区| 亚洲高清一区二区三区 | 色老头在线一区二区三区 | 国产精品福利区一区二区三区四区| 一区二区免费电影| 色一乱一伦一图一区二区精品| 国产精品揄拍一区二区久久| 国内精自品线一区91| 久久久91精品国产一区二区三区 | 一区二区精品在线观看| 久久99精品国产一区二区三区| 精品无码一区二区三区爱欲九九| 中文字幕一区二区人妻性色| 亚无码乱人伦一区二区| 精品国产一区二区三区| 国产成人精品一区二三区在线观看| 波霸影院一区二区| 亚洲av色香蕉一区二区三区蜜桃| 日本精品夜色视频一区二区| 97久久精品无码一区二区| 国内精品无码一区二区三区| 国产精品电影一区二区三区| 夜夜精品无码一区二区三区| 国产熟女一区二区三区四区五区| 亚洲国产精品一区第二页 |