web-dev-qa-db-ja.com

file_save_data関数を使用する場合、ファイルIDを取得するにはどうすればよいですか?

プログラムでD8に新しいメディアファイルを追加します。それぞれのfidをどのように決定するのですか?また、実際のファイルコンテンツをメディアタイプに入れるにはどうすればよいですか?
これは私のコードです

$file_name=$file_info['file_name'];
  $file = file_get_contents($fullpath."/".$file_name); // string
 $filesaved = file_save_data($file, 'public://'.$file_directory_name."/".$file_info['file_name')',FILE_EXISTS_REPLACE);
  $fid = ???; 
  $static_media = Media::create([
      'bundle' => 'document',
      'uid' => '1',
      'langcode' => Language::LANGCODE_DEFAULT,
      'status' => Media::PUBLISHED,
      'your_image_field_name_here' => [
        'target_id' => $fid,
        'alt' => t('foo'),
        'title' => t('bar'),
      ],
    ]);
    $static_media->save();
6
Diana

試す

$filesaved = file_save_data($file, 'public://'.$file_directory_name."/".$file_info['file_name']), 'FILE_EXISTS_REPLACE');
$fid = $filesaved->id; 

file-> idは、エンティティ参照target_id(つまりファイルフィールド)として使用できるファイルのIDです。

ノードにファイルを保存して添付する良い例

use \Drupal\node\Entity\Node;

// Create file object from remote URL.
$data = file_get_contents('https://www.drupal.org/files/druplicon.small_.png');
$file = file_save_data($data, 'public://druplicon.png', FILE_EXISTS_REPLACE);

// Create node object with attached file.
$node = Node::create([
  'type'        => 'article',
  'title'       => 'Druplicon test',
  'field_image' => [
    'target_id' => $file->id(),
  ],
]);
$node->save();

ファイルがローカルファイルシステムにすでに存在し、既存のノードにアタッチする場合はどうなりますか?以下もその例です。

use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;

// Create file object from a locally copied file.
$uri  = file_unmanaged_copy('public://source.jpg', 'public://destination.jpg', FILE_EXISTS_REPLACE);
$file = File::Create([
  'uri' => $uri,
]);
$file->save();

// Load existing node and attach file.
$node = Node::load(1);
$node->field_image->setValue([
  'target_id' => $file->id(),
]);
$node->save();

そして最後に、プレースホルダーファイルをノードに貼り付けたい場合はどうでしょうか。 Drupal 8のおかげで、これは簡単すぎます。

use \Drupal\node\Entity\Node;

$node = Node::create([
  'type'  => 'article',
  'title' => 'Generated image test',
]);
$node->field_image->generateSampleItems();
$node->save();
9
Yusef

file_save_data は、保存が成功するとファイルオブジェクトを返します。そのオブジェクトは FileInterface のインスタンスでなければなりません。

そのため、次に行うことができます:

$fid = $filesaved->id();

1
Kevin

関数file_save_data()はファイルエンティティを返します。したがって、_$filesaved->fid->value_が必要だと思います。そして$filesaved->id()は同じ結果を返します。

1
Andrew Nim