web-dev-qa-db-ja.com

Webformsにファイルをプライベートファイルシステムに保存させたり、データベースBLOBとして保存させるにはどうすればよいですか?

Drupal 7では、ファイルシステムを次のように構成しています。

enter image description here

sites/all/modules/webform/components/file.incにあるWebformsのファイルコンポーネントのコードでは、WebFormファイルのアップロードがchanging 'scheme' => 'public'から'scheme' => 'private'によってプライベートファイルシステムに移動されるように簡単に変更できるようです。しかし、drush upcで簡単に上書きされる可能性のあるものをハッキング(変更)することの落とし穴も知っています。

 /**
 * Implements _webform_defaults_component().
 */
function _webform_defaults_file() {
  return array(
    'name' => '',
    'form_key' => NULL,
    'required' => 0,
    'pid' => 0,
    'weight' => 0,
    'extra' => array(
      'filtering' => array(
        'types' => array('gif', 'jpg', 'png'),
        'addextensions' => '',
        'size' => '2 MB',
      ),
      'scheme' => 'public',
      'directory' => '',
      'progress_indicator' => 'throbber',
      'title_display' => 0,
      'description' => '',
      'attributes' => array(),
      'private' => FALSE,
      'analysis' => FALSE,
    ),
  );
}

すべてのファイルのアップロードがfile_managedテーブルに参照として格納されていると仮定

mysql> describe file_managed;
+-----------+---------------------+------+-----+---------+----------------+
| Field     | Type                | Null | Key | Default | Extra          |
+-----------+---------------------+------+-----+---------+----------------+
| fid       | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| uid       | int(10) unsigned    | NO   | MUL | 0       |                |
| filename  | varchar(255)        | NO   |     |         |                |
| uri       | varchar(255)        | NO   | UNI |         |                |
| filemime  | varchar(255)        | NO   |     |         |                |
| filesize  | bigint(20) unsigned | NO   |     | 0       |                |
| status    | tinyint(4)          | NO   | MUL | 0       |                |
| timestamp | int(10) unsigned    | NO   | MUL | 0       |                |
+-----------+---------------------+------+-----+---------+----------------+

ファイルをpublic://からprivate://および更新に手動で移動するファイルアップロードへのポスト操作を実行することは可能ですか?データベースエントリ? hook_file_presave または hook_file_insert はこれを実現するための優れたツールでしょうか?

更新

Hook_webform_component_info_alter()を使用するという提案に基づいて、私は以下を実装しました

/**
 * Implements hook_webform_component_info_alter().
 */
function  MYMOD_webform_component_info_alter(&$components) {
   $components['file']['extra']['scheme'] = 'private';
   dsm($components['file']);
}


/**
 * Implements hook_file_insert().
 */
function MYMOD_file_insert($file) {
  dsm($file);
}

DSM()の出力でコンポーネント配列が変更されたように見えますが、hook_file_insert()からのDSMはファイルがパブリックエリアに配置されたことを示しています。

enter image description here

1
Rick

Webformを少し掘り下げました。私は信じているwebformでこれのための設定があります。ウェブフォームの問題に投稿された問題がありましたが、解決されました。 ファイル送信をプライベートディレクトリに保存

OPは既に解決されていますが、将来の見物人のために:上記の問題のコメントに、これを達成する方法についての説明があります。また、Webformが最新であることを確認してください。

2
burnsjeremy

Webフォーム自体にはAPIがあります。 hook_webform_component_info_alter() を実装することで、モジュールをハッキングせずにschemepublicからprivateに変更できます。

カスタムモジュールでは、次のようになります。

function MYMODULE_webform_component_info_alter(&$components) {
  $components['file']['extra']['scheme'] = 'private';
}
1
tenken