整合營銷服務商

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

          免費咨詢熱線:

          作為一個前端工程師也要掌握的幾種文件路徑知識

          作為一個前端工程師也要掌握的幾種文件路徑知識

          之前在做webpack配置時候多次用到路徑相關內容。最近在寫項目的時候,有一個文件需要上傳到阿里云oss的功能,同時本地服務器也需要保留一個文件備份。多次用到了文件路徑相關內容以及Node核心API的path模塊,所以系統的學習了一下,整理了這篇文章。

          node中的路徑分類

          node中的路徑大致分5類,dirname,filename,process.cwd(),./,../,其中dirname,filename,process.cwd()絕對路徑

          通過代碼對每個分類進行說明:

          文件目錄結構如下:

          代碼pra/
           - node核心API/
           - fs.js
           - path.js
          

          path.js中的代碼

          const path=require('path');
          console.log(__dirname);
          console.log(__filename);
          console.log(process.cwd());
          console.log(path.resolve('./'));
          

          在代碼pra目錄下運行命令 node node核心API/path.js,我們可以看到結果如下:

          /koala/Desktop/程序員成長指北/代碼pra/node核心API
          /koala/Desktop/程序員成長指北/代碼pra/node核心API/path.js
          /koala/Desktop/程序員成長指北/代碼pra
          /koala/Desktop/程序員成長指北/代碼pra
          

          然后我們有可以在node核心API目錄下運行這個文件,node path.js,運行結果如下:

          /koala/Desktop/程序員成長指北/代碼pra/node核心API
          /koala/Desktop/程序員成長指北/代碼pra/node核心API/path.js
          /koala/Desktop/程序員成長指北/代碼pra/node核心API
          /koala/Desktop/程序員成長指北/代碼pra/node核心API
          

          對比輸出結果,暫時得到的結論是

          • __dirname: 總是返回被執行的 js 所在文件夾的絕對路徑
          • __filename: 總是返回被執行的 js 的絕對路徑
          • process.cwd(): 總是返回運行 node 命令時所在的文件夾的絕對路徑
          • ./: 跟 process.cwd() 一樣,返回 node 命令時所在的文件夾的絕對路徑

          我自己是一名從事了多年開發的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取。

          為什么說上面是暫時得到的結論,因為是有錯誤的,再看一段代碼:我們在path.js中加上這句代碼

          exports.A=1;
          

          之前直接通過readFile讀取文件路徑報錯,

          fs.readFile('./path.js',function(err,data){
           
          });
          

          現在在剛才報錯的fs.js里面加這兩句代碼看看:

          const test=require('./path.js');
          console.log(test)
          

          在代碼pra/目錄下運行node node核心API/fs.js,最后查看結果,說明是可以訪問到的:

          { A: 1 }
          

          那么關于 ./正確的結論是:

          在 require()中使用是跟__dirname 的效果相同,不會因為啟動腳本的目錄不一樣而改變,在其他情況下跟 process.cwd() 效果相同,是相對于啟動腳本所在目錄的路徑。

          路徑知識總結:

          • __dirname:獲得當前執行文件所在目錄的完整目錄名
          • __filename:獲得當前執行文件的帶有完整絕對路徑的文件名
          • process.cwd():獲得當前執行node命令時候的文件夾目錄名
          • ./:不使用require時候,./與process.cwd()一樣,使用require時候,與__dirname一樣

          只有在 require() 時才使用相對路徑(./, ../) 的寫法,其他地方一律使用絕對路徑,如下:

          // 當前目錄下
           path.dirname(__filename) + '/path.js';
          // 相鄰目錄下
           path.resolve(__dirname, '../regx/regx.js');
          

          path

          前面講解了路徑的相關比較,接下來單獨聊聊path這個模塊,這個模塊在很多地方比較常用,所以,對于我們來說,掌握他,對我們以后的發展更有利,不用每次看webpack的配置文件還要去查詢一下這個api是干什么用的,很影響我們的效率

          這是api官網地址:https://nodejs.org/api/path.html

          個人認為官網中的api沒有必要都掌握,下面會對一些常用的api進行講解,我經常用到的,或者作為一個前端開發工程師在webpack等工程配置的時候經常用到的。

          path.normalize

          舉例說明

          const path=require('path');
          
          console.log(path.normalize('/koala/Desktop//程序員成長指北//代碼pra/..'));
          

          規范后的結果

          /koala/Desktop/程序員成長指北/代碼pra
          

          作用總結

          規范化路徑,把不規范的路徑規范化。

          path.join

          舉例說明:

          const path=require('path');
          console.log(path.join('src', 'task.js'));
          
          const path=require('path');
          console.log(path.join(''));
          

          轉化后的結果

          src/task.js
          .
          

          作用總結

          path.join([...paths])

          1. 傳入的參數是字符串的路徑片段,可以是一個,也可以是多個
          2. 返回的是一個拼接好的路徑,但是根據平臺的不同,他會對路徑進行不同的規范化,舉個例子,Unix系統是/,Windows系統是\,那么你在兩個系統下看到的返回結果就不一樣。
          3. 如果返回的路徑字符串長度為零,那么他會返回一個.,代表當前的文件夾。
          4. 如果傳入的參數中有不是字符串的,那就直接會報錯

          path.parse

          舉例說明

          const path=require('path');
          console.log(path.parse('/koala/Desktop/程序員成長指北/代碼pra/node核心API'));
          

          運行結果

          { root: '/',
           dir: '/koala/Desktop/程序員成長指北/代碼pra',
           base: 'node核心API',
           ext: '',
           name: 'node核心API' 
          }
          

          作用總結

          他返回的是一個對象,那么我們來把這么幾個名詞熟悉一下:

          1. root:代表根目錄
          2. dir:代表文件所在的文件夾
          3. base:代表整一個文件
          4. name:代表文件名
          5. ext: 代表文件的后綴名

          path.basename

          舉例說明

          const path=require('path');
          console.log(path.basename('/koala/Desktop/程序員成長指北/代碼pra/node核心API'));
          console.log(path.basename('/koala/Desktop/程序員成長指北/代碼pra/node核心API/path.js', '.js'));
          

          運行結果

          看了上面代碼的例子,我想應該知道了basename結果,嘿嘿。

          node核心API
          path
          

          作用總結

          basename接收兩個參數,第一個是path,第二個是ext(可選參數),當輸入第二個參數的時候,打印結果不出現后綴名

          path.dirname

          舉例說明

          const path=require('path');
          console.log(path.dirname('/koala/Desktop/程序員成長指北/代碼pra/node核心API'));
          

          運行結果

          /koala/Desktop/程序員成長指北/代碼pra
          

          作用總結

          返回文件的目錄完整地址

          path.extname

          舉例說明

          const path=require('path');
          path.extname('index.html');
          path.extname('index.coffee.md');
          path.extname('index.');
          path.extname('index');
          path.extname('.index');
          

          運行結果

          .html
          .md
          .
          ''
          ''
          

          作用總結

          返回的是后綴名,但是最后兩種情況返回'',大家注意一下。

          path.resolve

          舉例說明

          const path=require('path');
          console.log(path.resolve('/foo/bar', '/bar/faa', '..', 'a/../c'));
          

          輸出結果

          /bar/c
          

          作用總結

          path.resolve([...paths])

          path.resolve就相當于是shell下面的cd操作,從左到右運行一遍cd path命令,最終獲取的絕對路徑/文件名,這個接口所返回的結果了。但是resolve操作和cd操作還是有區別的,resolve的路徑可以沒有,而且最后進入的可以是文件。具體cd步驟如下

          cd /foo/bar/ //這是第一步, 現在的位置是/foo/bar/
          cd /bar/faa //這是第二步,這里和第一步有區別,他是從/進入的,也就時候根目錄,現在的位置是/bar/faa
          cd .. //第三步,從faa退出來,現在的位置是 /bar
          cd a/../c //第四步,進入a,然后在推出,在進入c,最后位置是/bar/c
          

          path.relative

          舉例說明

          const path=require('path');
          
          console.log(path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'));
          
          console.log(path.relative('/data/demo', '/data/demo'));
          
          console.log(path.relative('/data/demo', ''));
          

          運行結果

          ../../impl/bbb
           ""
           ../../koala/Desktop/程序員成長指北/代碼pra/node核心API
          

          作用總結

          path.relative(from, to)

          描述:從from路徑,到to路徑的相對路徑。

          邊界:

          • 如果from、to指向同個路徑,那么,返回空字符串。
          • 如果from、to中任一者為空,那么,返回當前工作路徑。

          總結

          本篇文章關于路徑的知識就說到這里,基礎很重要的,既能節約開發時間,又能減少報錯。


          原文鏈接:https://mp.weixin.qq.com/s/CPYa7YjQDJGYWzKwTox5Rg
          作者:程序員成長指北

          題從何而來

          在做解除攝像頭設備占用時,遇到了一個棘手的問題,就是視頻窗口頁面有太多的 video 標簽交錯使用。

          利用 stream.disposeMediaStream() 這種方法已經無法有效關閉占用攝像頭的權限,于是想到通過 “退出視頻窗口進行刷新” 的方式來解決攝像頭設備被占用的問題。


          首先,刷新的幾種方法

          1.this.$router.go(0)

          go 函數的用法需要帶參數,例如 go(-1) 表示返回上一頁,go(0) 跟第2種方法差不多。

          2.location.reload()

          重新加載頁面。

          3.provide/inject

          在 App.vue,聲明 reload 方法,控制 router-view 的顯示或隱藏,從而控制頁面的再次加載。


          使用 file 模式的訪問方式

          以上幾種方法在 dev 開發環境下,利用 http 路徑訪問是沒有問題的。

          但經過打包處理后,訪問的路徑改為 file 模式,那以上的刷新就會直接再次去訪問 index.html 文件,等于回到了首頁,并沒有停留在之前的頁面,所以需要做一些處理來解決這個問題。


          1、利用 electron-store 插件來緩存登錄數據

          import ElectronStore from "electron-store"; 
          export const store=new ElectronStore();

          將登錄狀態記錄下來,如下:

          store.set("logined",1);


          2、返回頁面,進行刷新釋放攝像頭設備

          if(store.get("logined")==1){
          window.location.reload(true);
          }


          3、進入到登錄頁,腳本自動登錄

          if(store.get("logined")==1){
          this.$store.dispatch("user/login", this.loginForm).then(()=> {
            store.set("logined",0);
            ipcRenderer.send("mainWindow");   this.$router.push({
             path: "/path",
             query: this.otherQuery,
             });
             }).catch((err)=> {   console.log(err);
             });
          }


          小結

          使用 getUserMedia 調用過的攝像頭設備,若出現無法釋放的情況,大家可以嘗試一下這種方法。以上就是本期刷新 electron 頁面的分享,希望能給大家帶來幫助。


          下期給大家分享更多實戰中的點滴,如果大家對此感興趣,歡迎各位關注、留言,大家的支持就是我的動力!

          Flask中,文件上傳通常涉及創建一個表單,用戶可以通過這個表單上傳文件。然后,后端代碼會處理接收到的文件。以下是實現文件上傳功能的步驟:

          創建HTML表單 - 使用標簽創建一個表單,設置enctype="multipart/form-data"屬性以支持文件上傳。

          File Upload


          創建Flask路由 - 定義一個處理文件上傳的路由。

          from flask import Flask, request, redirect, url_for, send_from_directory

          app=Flask(__name__)

          @app.route('/upload', methods=['GET', 'POST'])

          def upload_file():

          if request.method=='POST':

          file=request.files['file']

          if file and '.jpg' in file.filename:

          # 保存上傳的文件

          filename='uploads/' + file.filename

          file.save(filename)

          # 重定向到文件上傳后的頁面

          return redirect(url_for('success', filename=filename))

          return '''

          '''

          @app.route('/success/')

          def success(filename):

          # 返回上傳成功的頁面,顯示文件名和下載鏈接

          return f'File uploaded successfully: Download {filename}'

          @app.route('/download_file/')

          def download_file(filename):

          return send_from_directory(app.root_path + '/uploads', filename)

          if __name__=="__main__":

          app.run()


          處理上傳的文件 - 在Flask視圖函數中,通過request.files字典訪問上傳的文件。

          保存上傳的文件 - 將上傳的文件保存到服務器的指定目錄中。

          重定向或返回上傳結果 - 一旦文件被保存,可以重定向用戶到一個新頁面,顯示上傳成功的信息,或者直接在原頁面顯示上傳結果。

          提供下載鏈接 - 為了讓用戶能夠下載上傳的文件,可以創建一個路由來提供文件的下載服務。在示例中,使用了send_from_directory函數來實現。

          確保服務器上的目標目錄對于Web服務是可寫的,并且處理上傳的代碼要考慮安全性,比如檢查文件類型、大小,防止上傳惡意文件。此外,對于生產環境,應該使用更高級的文件上傳處理方案,比如文件存儲在外部服務上,以及設置適當的權限和安全措施。


          主站蜘蛛池模板: 伦理一区二区三区| 日韩精品一区二区三区影院| 在线观看国产一区二三区| 无码人妻精品一区二区三区久久久| 国产主播一区二区| 亚洲AV无码一区二区乱子伦| 日本福利一区二区| 无码精品人妻一区二区三区漫画| 国产成人精品无码一区二区老年人 | 亚洲综合色自拍一区| 国产乱码精品一区二区三区香蕉| 精品一区二区在线观看| 国产成人精品无人区一区 | 国产91精品一区二区麻豆网站| 一区二区国产精品| 国产精品成人免费一区二区 | 一区二区三区中文| 色一情一乱一伦一区二区三欧美| 精品久久一区二区三区| V一区无码内射国产| 波多野结衣精品一区二区三区| 亚洲一区免费在线观看| 制服丝袜一区二区三区| 国产精品亚洲高清一区二区 | 精品一区二区三区无码免费视频 | 中文字幕无线码一区二区| 无码人妻精品一区二区在线视频| 国产一区二区三区在线视頻| 免费人人潮人人爽一区二区| 蜜臀AV无码一区二区三区| 韩国美女vip福利一区| 一区二区在线视频| 3d动漫精品啪啪一区二区中| 亚洲AV福利天堂一区二区三| 美女啪啪一区二区三区| 日本不卡在线一区二区三区视频| 国产熟女一区二区三区四区五区 | 无码精品不卡一区二区三区| 毛片一区二区三区| 成人区人妻精品一区二区三区| 亚洲av乱码中文一区二区三区|