web-dev-qa-db-ja.com

ノードフィールドの画像URLを編集する方法

ノードでの画像のアップロードと編集にメディアブラウザウィジェットを使用しています。私の画像は画像フィールドを使用して保存されます。アップロード後に画像のURLを編集することはできますか?私は達成する必要があります:

「foo.png」という名前のファイルをアップロードすると、デフォルトでは次のURLになります。

/sites/default/files/media/.../foo.png

ファイル名を「bar.png」に編集する必要があるため、結果のパスは次のようになります。

/sites/default/files/media/.../bar.png

(URLではファイル名のみが変更されます)

メディアブラウザウィジェットを使用して可能であるため、ファイル名を編集してみました。ただし、ファイル名を編集しても、URLの変更には影響しません。また、次のフックを使用しようとしました: hook_file_presave このフックを使用して、uriパラメーターをプログラムで変更しようとしました。しかし、ファイル名の変更も、URIの変更も、ファイルの影響を受けるURLの変更も行いません。ディレクトリsites/default/files/..を見ると、ファイル名がアップロードしたものと同じであり、ファイル名やURIのその後の変更に影響を与えていないことがわかります。 php $ fileオブジェクトをロードすると、$ file-> filenameおよび$ file-> uriプロパティが変更されたことがわかります。

ファイルのアップロード後にファイルのURL(URLの最後の部分-ファイル名)を変更することはできますか?

//編集:hook_file_presaveで次の変更を行おうとしました:

function mymodule_file_presave($file) {
 if ($file->type != 'image') {
  return;
  }
 if (!empty($file->filename)) {
   $uri_parts = explode('/', $file->uri);
   $count = count($uri_parts);
   $uri_parts[$count - 1] = $file->filename;
   $file->uri = implode('/', $uri_parts);
   $file->destination = $file->uri;
   }
 }
1
tomas.teicher

ファイルの名前を変更するには、PHPの rename() 関数を使用する必要があります。これを行うには、次のようにdrupal_realpath()を使用してファイルの完全なローカルパスを取得します。

// Fetch the local absolute path of our image
$local_path = drupal_realpath($file->uri);

ファイルの名前を変更したら、ファイルのURIを変更する必要があります(他の属性も考えられます。print_r($ file)を使用して確認してください)。

ドキュメントの文言は私には少し奇妙です、それは "ファイルがデータベースに追加されたとき" と言います。これは、私にとって、ファイルメタデータがすでにデータベースに保存されていることを意味します。ただし、ドキュメントに示されている例では、ファイルオブジェクトを返さなくてもこの情報を編集できます(ただし、&$ file ...?を使用しません)。奇妙な。

とにかく、コードは次のようになります。

function mymodule_file_presave($file) {
  if ($file->type != 'image') {
    return;
  }
  if (!empty($file->filename)) {

    // Will likely be 'public://'
    $scheme = file_uri_scheme($file->uri);

    // Get full path of image location
    $local_path = drupal_realpath($file->uri);

    // Create new name using drupal scheme format
    $new_uri = $scheme.'new_name_here.jpg';

    // Actual OS rename of file
    rename($local_path, drupal_realpath($new_uri);

    // Update $file object with new uri
    $file->uri = $new_uri;

    // Not sure if this is still needed...
    $file->destination = $file->uri;
  }
}
0
OnNIX