3 namespace Drupal\file\Entity;
5 use Drupal\Core\Entity\ContentEntityBase;
6 use Drupal\Core\Entity\EntityChangedTrait;
7 use Drupal\Core\Entity\EntityStorageInterface;
8 use Drupal\Core\Entity\EntityTypeInterface;
9 use Drupal\Core\Field\BaseFieldDefinition;
10 use Drupal\file\FileInterface;
11 use Drupal\user\UserInterface;
14 * Defines the file entity class.
20 * label = @Translation("File"),
21 * label_collection = @Translation("Files"),
22 * label_singular = @Translation("file"),
23 * label_plural = @Translation("files"),
24 * label_count = @PluralTranslation(
25 * singular = "@count file",
26 * plural = "@count files",
29 * "storage" = "Drupal\file\FileStorage",
30 * "storage_schema" = "Drupal\file\FileStorageSchema",
31 * "access" = "Drupal\file\FileAccessControlHandler",
32 * "views_data" = "Drupal\file\FileViewsData",
34 * base_table = "file_managed",
37 * "label" = "filename",
38 * "langcode" = "langcode",
43 class File extends ContentEntityBase implements FileInterface {
45 use EntityChangedTrait;
50 public function getFilename() {
51 return $this->get('filename')->value;
57 public function setFilename($filename) {
58 $this->get('filename')->value = $filename;
64 public function getFileUri() {
65 return $this->get('uri')->value;
71 public function setFileUri($uri) {
72 $this->get('uri')->value = $uri;
78 * @see file_url_transform_relative()
80 public function url($rel = 'canonical', $options = []) {
81 return file_create_url($this->getFileUri());
87 public function getMimeType() {
88 return $this->get('filemime')->value;
94 public function setMimeType($mime) {
95 $this->get('filemime')->value = $mime;
101 public function getSize() {
102 return $this->get('filesize')->value;
108 public function setSize($size) {
109 $this->get('filesize')->value = $size;
115 public function getCreatedTime() {
116 return $this->get('created')->value;
122 public function getOwner() {
123 return $this->get('uid')->entity;
129 public function getOwnerId() {
130 return $this->get('uid')->target_id;
136 public function setOwnerId($uid) {
137 $this->set('uid', $uid);
144 public function setOwner(UserInterface $account) {
145 $this->set('uid', $account->id());
152 public function isPermanent() {
153 return $this->get('status')->value == FILE_STATUS_PERMANENT;
159 public function isTemporary() {
160 return $this->get('status')->value == 0;
166 public function setPermanent() {
167 $this->get('status')->value = FILE_STATUS_PERMANENT;
173 public function setTemporary() {
174 $this->get('status')->value = 0;
180 public static function preCreate(EntityStorageInterface $storage, array &$values) {
181 // Automatically detect filename if not set.
182 if (!isset($values['filename']) && isset($values['uri'])) {
183 $values['filename'] = drupal_basename($values['uri']);
186 // Automatically detect filemime if not set.
187 if (!isset($values['filemime']) && isset($values['uri'])) {
188 $values['filemime'] = \Drupal::service('file.mime_type.guesser')->guess($values['uri']);
195 public function preSave(EntityStorageInterface $storage) {
196 parent::preSave($storage);
198 // The file itself might not exist or be available right now.
199 $uri = $this->getFileUri();
200 $size = @filesize($uri);
202 // Set size unless there was an error.
203 if ($size !== FALSE) {
204 $this->setSize($size);
211 public static function preDelete(EntityStorageInterface $storage, array $entities) {
212 parent::preDelete($storage, $entities);
214 foreach ($entities as $entity) {
215 // Delete all remaining references to this file.
216 $file_usage = \Drupal::service('file.usage')->listUsage($entity);
217 if (!empty($file_usage)) {
218 foreach ($file_usage as $module => $usage) {
219 \Drupal::service('file.usage')->delete($entity, $module);
222 // Delete the actual file. Failures due to invalid files and files that
223 // were already deleted are logged to watchdog but ignored, the
224 // corresponding file entity will be deleted.
225 file_unmanaged_delete($entity->getFileUri());
232 public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
233 /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
234 $fields = parent::baseFieldDefinitions($entity_type);
236 $fields['fid']->setLabel(t('File ID'))
237 ->setDescription(t('The file ID.'));
239 $fields['uuid']->setDescription(t('The file UUID.'));
241 $fields['langcode']->setLabel(t('Language code'))
242 ->setDescription(t('The file language code.'));
244 $fields['uid'] = BaseFieldDefinition::create('entity_reference')
245 ->setLabel(t('User ID'))
246 ->setDescription(t('The user ID of the file.'))
247 ->setSetting('target_type', 'user');
249 $fields['filename'] = BaseFieldDefinition::create('string')
250 ->setLabel(t('Filename'))
251 ->setDescription(t('Name of the file with no path components.'));
253 $fields['uri'] = BaseFieldDefinition::create('file_uri')
255 ->setDescription(t('The URI to access the file (either local or remote).'))
256 ->setSetting('max_length', 255)
257 ->setSetting('case_sensitive', TRUE)
258 ->addConstraint('FileUriUnique');
260 $fields['filemime'] = BaseFieldDefinition::create('string')
261 ->setLabel(t('File MIME type'))
262 ->setSetting('is_ascii', TRUE)
263 ->setDescription(t("The file's MIME type."));
265 $fields['filesize'] = BaseFieldDefinition::create('integer')
266 ->setLabel(t('File size'))
267 ->setDescription(t('The size of the file in bytes.'))
268 ->setSetting('unsigned', TRUE)
269 ->setSetting('size', 'big');
271 $fields['status'] = BaseFieldDefinition::create('boolean')
272 ->setLabel(t('Status'))
273 ->setDescription(t('The status of the file, temporary (FALSE) and permanent (TRUE).'))
274 ->setDefaultValue(FALSE);
276 $fields['created'] = BaseFieldDefinition::create('created')
277 ->setLabel(t('Created'))
278 ->setDescription(t('The timestamp that the file was created.'));
280 $fields['changed'] = BaseFieldDefinition::create('changed')
281 ->setLabel(t('Changed'))
282 ->setDescription(t('The timestamp that the file was last changed.'));