ノードでの画像のアップロードと編集にメディアブラウザウィジェットを使用しています。私の画像は画像フィールドを使用して保存されます。アップロード後に画像の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;
}
}
ファイルの名前を変更するには、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;
}
}