Drupal 8 結合Nginx實現文件上傳進度,提升上傳文件性能

Drupal 8 自帶的上傳進度功能,須要PECL uploadprogress library擴展支持。
安裝後發現效果仍是不太好,不知道什麼緣由,進度條不能正常顯示,並且上傳較大文件時,速度比較慢。因而想到利用Nginx的uploadprogres模塊來實現上傳進度。前端

這個模塊須要在編譯安裝的時候加上,編譯安裝請看:編譯安裝Nginx以及配置運行Drupal 8,實現上傳進度功能nginx

搜索了一下,找到一個模塊:FileField Nginx Progress,不過只有Drupal7版本的,因而看了一下代碼,瞭解了實現思路,根據這個思路,作了一個Drupal 8版本的出來。
模塊地址:upload_progressgit

因爲Nginx uploadprogress模塊的上傳進度和Drupal自帶的上傳進度獲取方式不一樣,因此要把從Nginx獲取到的進度信息,轉換成Drupal須要的格式,再返回給Drupal前端。github

簡單的說一下實現的思路:segmentfault

定義獲取進度信息的路由性能

  1. 在Nginx裏設置獲取進度信息的URL。orm

  2. 定義一個路由,和對應的控制器(controller)。對象

  3. 在控制器裏從第一步定義的URL獲取到的信息,轉換成Drupal須要的格式,而後返回給前端。路由

自定義文件控件get

  1. 基於FileWidget自定義一個文件控件(widget),這樣能夠比較方便的覆寫文件處理方法。

  2. 覆寫控件的settingsForm方法,目的是實現選擇進度指示器的類型(若是Drupal檢測到沒有安裝PECL uploadprogress library擴展,不會顯示選擇進度指示器的表單)。

  3. 而後覆寫process方法,目的是爲表單預先設置一些內容。Nginx uploadprogress模塊須要表單提交時以QueryString方式提供一個X-Progress-ID,並且還須要把獲取進度信息的URL修改爲自定義的路由。這兩個動做都是在這一步完成的。

  4. 覆寫value方法,這個方法是提交文件時回調的方法,後面使用Nginx upload模塊替代PHP的文件上傳功能,會用到這個方法。

設置進度指示器爲進度條

  1. 結構 --> 內容類型 --> 管理表單顯示。把須要進度條的字段的控制器,修改爲上面自定義的控制器。

  2. 點擊字段後面的齒輪圖標,選擇進度指示器爲進度條。

以上步驟完成後,就能夠實現進度條功能了。
接下來使用Nginx upload模塊替代PHP的文件上傳功能,目的是提升文件上傳的性能。因爲Nginx擴展是使用C語言編寫的,理論上來講會比PHP性能好不少。並且能夠避免上傳大文件時PHP執行超時引發錯誤。
根據前面提供的Nginx文章,配置好Nginx以後,就能夠進行如下操做。

  1. 根據上面的方法,覆寫value方法。

  2. 根據Nginx裏自定義的字段信息,獲取POST內容(文件名,路徑,大小,類型等)。

  3. 把文件移動到目標目錄。

  4. 新建一個File對象,把uri設置成剛上傳的文件。

  5. 把value方法的input['fid']值設置成新建立的File對象的ID。

  6. 調用parent::value方法。

相關文章
相關標籤/搜索