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方法。

相关文章
相关标签/搜索