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

頁(yè)面如何通過(guò)input標(biāo)簽來(lái)顯示獲取的圖片?

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

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

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

那么問(wèn)題來(lái)了,真的能通過(guò)value的值來(lái)獲取到路徑嗎猛频?

答案是否定的狮崩,不然問(wèn)題也就迎刃而解了不是嗎蛛勉?

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

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

getFilePath.gif

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

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

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

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

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

那么問(wèn)題又來(lái)了纤勒,既然input獲取不到,又不讓我改瀏覽器隆檀,那到底怎么辦呢摇天?

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

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

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

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


既然已經(jīng)拿到了我們想要的東西歧斟,那么就開(kāi)工了纯丸。

  • 通過(guò)ajax加上后臺(tái)來(lái)實(shí)現(xiàn)讓頁(yè)面上顯示圖片
    • 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)聽(tīng)input的改變
          inputObj.onchange = function(){
              // 拿到文件的信息
              var pic = inputObj.files[0];
    
              // 創(chuàng)建一個(gè)formData對(duì)象
              var formData = new FormData();
              // 將文件信息存入這個(gè)對(duì)象中
              formData.append('file',pic);
    
              // 創(chuàng)建異步對(duì)象
              var xhr = new XMLHttpRequest();
    
              // 設(shè)置method和url 
              xhr.open('post','getFilePath.php');
    
              // 發(fā)送請(qǐng)求,將formData這個(gè)對(duì)象傳遞
              xhr.send(formData);
    
              // 監(jiān)聽(tīng)狀態(tài)
              xhr.onreadystatechange = function(){
                  // 如果請(qǐng)求已完成司训,并且成功找到網(wǎng)頁(yè),就拿到路徑值使用
                  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;
    

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

  • 通過(guò)FileReader()對(duì)象來(lái)讓頁(yè)面顯示圖片
    • 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)聽(tīng)input發(fā)生改變
          inputObj.onchange = function(){
              // 獲取上傳的文件信息
              var pic = inputObj.files[0];
    
              // 創(chuàng)建FileReader對(duì)象
              var reader = new FileReader();
    
              // 編碼成Data URL (這一步最為關(guān)鍵)
              reader.readAsDataURL(pic);
    
              // 監(jiān)聽(tīng)上傳完成
              reader.onload = function(){
                  // 拿到base64的路徑
                  var src = reader.result;
                  // 改變img的src屬性值
                  imgObj.src=src;
              }
    
          };
    

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

結(jié)語(yǔ)

  • 首先想說(shuō)的是 第一次用markdown寫(xiě)東西乌昔。并不是很會(huì)用隙疚。所以寫(xiě)的排版方面很是奇怪。只是希望看到人不要打我磕道。供屉。。溺蕉。
  • 然后 我還在前端這個(gè)泥坑里面摸爬滾打伶丐,所以寫(xiě)的東西有很多不足的地方,如果有什么錯(cuò)誤的地方疯特,還望見(jiàn)諒哗魂。
  • 最后想說(shuō)的是 H5 給我們真的提供的不少便利的東西,善用里面的屬性和方法會(huì)給我們的開(kāi)發(fā)帶來(lái)很多的便利。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辙芍,一起剝皮案震驚了整個(gè)濱河市啡彬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌故硅,老刑警劉巖庶灿,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吃衅,居然都是意外死亡往踢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)徘层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)峻呕,“玉大人利职,你說(shuō)我怎么就攤上這事∈莅” “怎么了猪贪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)讯私。 經(jīng)常有香客問(wèn)我热押,道長(zhǎng),這世上最難降的妖魔是什么斤寇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任桶癣,我火速辦了婚禮,結(jié)果婚禮上娘锁,老公的妹妹穿的比我還像新娘牙寞。我一直安慰自己,他們只是感情好莫秆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布间雀。 她就那樣靜靜地躺著,像睡著了一般镊屎。 火紅的嫁衣襯著肌膚如雪雷蹂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天杯道,我揣著相機(jī)與錄音匪煌,去河邊找鬼。 笑死党巾,一個(gè)胖子當(dāng)著我的面吹牛萎庭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播齿拂,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼驳规,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了署海?” 一聲冷哼從身側(cè)響起吗购,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砸狞,沒(méi)想到半個(gè)月后捻勉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刀森,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年踱启,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡埠偿,死狀恐怖透罢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冠蒋,我是刑警寧澤羽圃,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抖剿,受9級(jí)特大地震影響统屈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牙躺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腕扶。 院中可真熱鬧孽拷,春花似錦、人聲如沸半抱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窿侈。三九已至炼幔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間史简,已是汗流浹背乃秀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圆兵,地道東北人跺讯。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像殉农,于是被迫代替她去往敵國(guó)和親刀脏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

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