web-dev-qa-db-ja.com

ノードが保存された後、アップロードされたファイル名を変更するにはどうすればよいですか?

ノードを保存した後、アップロードしたファイルの名前を変更するにはどうすればよいですか?この目的のために FileField Paths モジュールがあることは知っていますが、Drupal 7.の場合はまだバグがあります。モジュールのソースを調べましたが、できません。必要なコードを抽出します。

私が知っている唯一のことは、hook_node_update()およびfield_attach_update()を使用する必要があることですが、それらの使用方法はわかりません。

3
Nick.h

多分これはあなたを助けるでしょう。昨夜、ファイルを自動生成してノードにアタッチするためのコードを書きました。ノードが保存される直前に、関数はノードからアップロードされたファイルを削除し、新しいファイルを作成して添付します。

あなたの場合、file_copyでファイル名を更新し、filefieldをリセットするだけでよい場合があります。

    function MODULE_node_presave($node) {
    /*
    *  Out with the old - detach file object
    */

    if (isset($node->field_filefieldname['und'][0]['fid'])) {
     file_delete(file_load($node->field_filefieldname['und'][0]['fid']));
    }
    unset($node->field_filefieldname['und'][0]);  //just for good measure

    /*
    *  In with the new
    */

    $filename = 'newfilename.dot';
    $filepath = conf_path().'/files/yourpath/';
    $touchout = $node->title;

    $tempFile = file_directory_temp().'/'.$filename;

    file_put_contents($tempFile, $touchout);

    $file = (object) array(
        'uid' => 1,
        'uri' => $tempFile,
        'filemime' => file_get_mimetype($tempFile),
        'status' => 1,
        'display' => 1,
      );

   /*
   *  File save operation, puts file in /sites/default/files and records update in db
   */ 

    if (file_prepare_directory($filepath, FILE_CREATE_DIRECTORY)) {
     $file = file_copy($file, 'public://path/'.$filename, FILE_EXISTS_REPLACE);
    }

   /*
   *  Reattaches our severed file, good as new.  
   */

    $node->field_filefieldname['und'][0] = (array)$file;
    }
    ?>
4
Justin

ファイルIDがわかっていれば(そしてPHPコードを実行してもかまわない)、とても簡単です。

$file = file_load($fid);
file_move($file, 'public://new/path');
2
drewish

hook_file_presave() を使用してファイルが保存される直前にデータベースに追加されたときに、ファイルを変更する方法は次のとおりです。

例えば:

_/**
 * Implements hook_file_presave().
 */
function hook_file_presave($file) {
  // Change the file timestamp to an hour prior.
  $file->timestamp -= 3600;
  if ($file->filename == 'my_file.wav') {
    $file->filename = 'mynewfile.wav';
  }
}
_

参照: プログラムでアップロードしたファイルの名前を変更するにはどうすればよいですか?(画像ファイルの自動名前変更)

注:このメソッドはファイルのファイル名を変更せず、file_managedテーブル内のファイル名のみを変更します。そのため、ファイル自体の名前を変更する場合は、手動で移動する必要があります(例:$file = file_move($file, $uri);)。これを見てください post

ファイルがデータベースに追加された後に変更するには、次のように hook_file_insert() を使用します。

_function hook_file_insert($file) {
  // Add a message to the log, if the file is a jpg
  $validate = file_validate_extensions($file, 'jpg');
  if (empty($validate)) {
    watchdog('file', 'A jpg has been added.');
  }
}
_
0
kenorb