關(guān)于瀏覽器如何在頁面上顯示準(zhǔn)備上傳的圖片的問題

頁面如何通過input標(biāo)簽來顯示獲取的圖片?

之所想到這個(gè)問題是因?yàn)槟炒巫鰟?dòng)畫的時(shí)候,需要獲取transform-origin的值,普通的left,right,center,top和bottom已經(jīng)滿足不了需求,就想到了將圖片顯示出來,獲取點(diǎn)擊的地方占圖片的百分比來找到變形的中心點(diǎn)

有了這個(gè)想法之后,大致的步驟就出來了

  • 首先在html中寫一個(gè)<input type =" file"/> 的標(biāo)簽
  • 然后在html中寫一個(gè)img標(biāo)簽
  • 在JS中獲取input的dom元素,通過value值來獲取路徑
  • 將路徑放在img的src屬性中

那么問題來了,真的能通過value的值來獲取到路徑嗎?

答案是否定的,不然問題也就迎刃而解了不是嗎?

這里我們不得不提到一個(gè)問題,那就是瀏覽器基于保護(hù)用戶的相關(guān)安全措施,將真實(shí)路徑隱藏了起來,而使用時(shí) fakepath+文件名 的形式來代替這個(gè)真實(shí)的路徑。

這里然我們來看個(gè)動(dòng)圖來看看到底是個(gè)什么鬼

getFilePath.gif

我們能在動(dòng)圖中看到我上傳的圖片明明是 D盤=》圖片=》p站 這個(gè)目錄下,最后console.log()出來的結(jié)果居然是 C:\fakepath\58649812_p1_master1200.jpg

什么鬼?為什么會(huì)這樣?

其實(shí)我們打印出來的值,正是瀏覽器的保護(hù)用戶的相關(guān)措施,具體情況我也不甚了解,但是我發(fā)現(xiàn)了一個(gè)驚天大秘密。我的IE居然可以通過這個(gè)方法獲取到圖片。并且我測試了IE8,9,10,11。都是可以拿到值的。

難道修改瀏覽器的某些配置就能獲取到了嗎?

根據(jù)我的推測,應(yīng)該是可以拿到值的,但是遨游在英特網(wǎng)的海洋的中,誰會(huì)嫌安全措施多了呢?既然瀏覽器為了用戶安全,給你禁止了一些功能,自然是為了讓用戶能夠在一個(gè)相對安全的網(wǎng)絡(luò)環(huán)境中遨游嘛。也許你不知道這些安全措施有多重要,這里小提到一個(gè)跨域問題,后面我會(huì)談到一個(gè)解除瀏覽器的跨域限制,來讓大家看看安全措施的重要性。

那么問題又來了,既然input獲取不到,又不讓我改瀏覽器,那到底怎么辦呢?

這里我們用到兩種方式來解決這個(gè)問題
  1. 通過ajax傳值到后臺,后臺獲取數(shù)據(jù)后拿到文件名,然后將圖片放到一個(gè)新的路徑下,將路徑返回給我們的JS,再利用JS來操作DOM讓圖片顯示出來(這里我們用php來舉個(gè)例子)
  2. 利用H5中的FileReader()對象

在具體怎么實(shí)現(xiàn)之前,讓我們來看看我們從本地拿進(jìn)來的圖片到底在input的哪里

input的這個(gè)dom元素到底有什么.gif

我們可以看到input這個(gè)對象下面的files屬性下面有我們想要的文件名,文件格式。


既然已經(jīng)拿到了我們想要的東西,那么就開工了。

  • 通過ajax加上后臺來實(shí)現(xiàn)讓頁面上顯示圖片
    • HTML部分
      <input type="file" >
      <br />
      <img src="" alt="">
    
    • JS部分
          // 獲取input的dom元素
          var inputObj = document.querySelector('input');
          // 獲取img的dom元素
          var imgObj = document.querySelector('img');
          // 監(jiān)聽input的改變
          inputObj.onchange = function(){
              // 拿到文件的信息
              var pic = inputObj.files[0];
    
              // 創(chuàng)建一個(gè)formData對象
              var formData = new FormData();
              // 將文件信息存入這個(gè)對象中
              formData.append('file',pic);
    
              // 創(chuàng)建異步對象
              var xhr = new XMLHttpRequest();
    
              // 設(shè)置method和url 
              xhr.open('post','getFilePath.php');
    
              // 發(fā)送請求,將formData這個(gè)對象傳遞
              xhr.send(formData);
    
              // 監(jiān)聽狀態(tài)
              xhr.onreadystatechange = function(){
                  // 如果請求已完成,并且成功找到網(wǎng)頁,就拿到路徑值使用
                  if(xhr.readyState == 4 && xhr.status == 200){
                      // 獲取返回值
                      var src = xhr.responseText;
                      // 改變img標(biāo)簽的src值
                      imgObj.src=src;
                  }
              };
    
          };
    
    • php部分
      // 獲取文件名
      $fileName = $_FILES['file']['name'];
      // 獲取暫存的路徑
      $tempPath = $_FILES['file']['tmp_name'];
      // 定義將要保存的路徑 ,你要保證你當(dāng)前文件下有images這個(gè)文件夾
      $savePath = 'images/'.$fileName;
    
      // 將圖片移動(dòng)到指定位置
      move_uploaded_file($tempPath, $savePath);
      // 返回路徑
      echo $savePath;
    

我去,就為了顯示張圖片而已,還得需要后臺來配合,太麻煩了。真有種殺豬用了牛刀的感覺。想想就覺得不爽。所以這里推薦使用FileReader()來實(shí)現(xiàn)功能

  • 通過FileReader()對象來讓頁面顯示圖片
    • HTML
      <input type="file" name="">
      <br />
      <img src="" alt="">
    
    • JS
      // 獲取input的dom元素
          var inputObj = document.querySelector('input');
          // 獲取img的dom元素
          var imgObj = document.querySelector('img');
          // 監(jiān)聽input發(fā)生改變
          inputObj.onchange = function(){
              // 獲取上傳的文件信息
              var pic = inputObj.files[0];
    
              // 創(chuàng)建FileReader對象
              var reader = new FileReader();
    
              // 編碼成Data URL (這一步最為關(guān)鍵)
              reader.readAsDataURL(pic);
    
              // 監(jiān)聽上傳完成
              reader.onload = function(){
                  // 拿到base64的路徑
                  var src = reader.result;
                  // 改變img的src屬性值
                  imgObj.src=src;
              }
    
          };
    

這樣一比較,代碼是不是少了很多?根本不需要什么后臺和ajax,就能讓圖片顯示。
這完全可以用在你要上傳圖片的時(shí)候,讓圖片預(yù)先在頁面上預(yù)覽,然后再一次性提交給后臺。

結(jié)語

  • 首先想說的是 第一次用markdown寫東西。并不是很會(huì)用。所以寫的排版方面很是奇怪。只是希望看到人不要打我。。。。
  • 然后 我還在前端這個(gè)泥坑里面摸爬滾打,所以寫的東西有很多不足的地方,如果有什么錯(cuò)誤的地方,還望見諒。
  • 最后想說的是 H5 給我們真的提供的不少便利的東西,善用里面的屬性和方法會(huì)給我們的開發(fā)帶來很多的便利。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • Ajax和XMLHttpRequest 我們通常將Ajax等同于XMLHttpRequest,但細(xì)究起來它們兩個(gè)是...
    changxiaonan閱讀 2,390評論 0 2
  • 最近有幾個(gè)問題一直被提及,就是圖片上傳這一塊,雖然之前也說過,今天對這部分內(nèi)容進(jìn)行一個(gè)歸納和整理. 1.自定義in...
    殷灬商閱讀 3,387評論 1 8
  • H5 meta詳解 viewport width:控制 viewport 的大小,可以指定的一個(gè)值,如果 600,...
    FConfidence閱讀 888評論 0 3
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,118評論 2 17

友情鏈接更多精彩內(nèi)容