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"),
22 * "storage" = "Drupal\file\FileStorage",
23 * "storage_schema" = "Drupal\file\FileStorageSchema",
24 * "access" = "Drupal\file\FileAccessControlHandler",
25 * "views_data" = "Drupal\file\FileViewsData",
27 * base_table = "file_managed",
30 * "label" = "filename",
31 * "langcode" = "langcode",
36 class File extends ContentEntityBase implements FileInterface {
38 use EntityChangedTrait;
43 public function getFilename() {
44 return $this->get('filename')->value;
50 public function setFilename($filename) {
51 $this->get('filename')->value = $filename;
57 public function getFileUri() {
58 return $this->get('uri')->value;
64 public function setFileUri($uri) {
65 $this->get('uri')->value = $uri;
71 * @see file_url_transform_relative()
73 public function url($rel = 'canonical', $options = []) {
74 return file_create_url($this->getFileUri());
80 public function getMimeType() {
81 return $this->get('filemime')->value;
87 public function setMimeType($mime) {
88 $this->get('filemime')->value = $mime;
94 public function getSize() {
95 return $this->get('filesize')->value;
101 public function setSize($size) {
102 $this->get('filesize')->value = $size;
108 public function getCreatedTime() {
109 return $this->get('created')->value;
115 public function getOwner() {
116 return $this->get('uid')->entity;
122 public function getOwnerId() {
123 return $this->get('uid')->target_id;
129 public function setOwnerId($uid) {
130 $this->set('uid', $uid);
137 public function setOwner(UserInterface $account) {
138 $this->set('uid', $account->id());
145 public function isPermanent() {
146 return $this->get('status')->value == FILE_STATUS_PERMANENT;
152 public function isTemporary() {
153 return $this->get('status')->value == 0;
159 public function setPermanent() {
160 $this->get('status')->value = FILE_STATUS_PERMANENT;
166 public function setTemporary() {
167 $this->get('status')->value = 0;
173 public static function preCreate(EntityStorageInterface $storage, array &$values) {
174 // Automatically detect filename if not set.
175 if (!isset($values['filename']) && isset($values['uri'])) {
176 $values['filename'] = drupal_basename($values['uri']);
179 // Automatically detect filemime if not set.
180 if (!isset($values['filemime']) && isset($values['uri'])) {
181 $values['filemime'] = \Drupal::service('file.mime_type.guesser')->guess($values['uri']);
188 public function preSave(EntityStorageInterface $storage) {
189 parent::preSave($storage);
191 // The file itself might not exist or be available right now.
192 $uri = $this->getFileUri();
193 $size = @filesize($uri);
195 // Set size unless there was an error.
196 if ($size !== FALSE) {
197 $this->setSize($size);
204 public static function preDelete(EntityStorageInterface $storage, array $entities) {
205 parent::preDelete($storage, $entities);
207 foreach ($entities as $entity) {
208 // Delete all remaining references to this file.
209 $file_usage = \Drupal::service('file.usage')->listUsage($entity);
210 if (!empty($file_usage)) {
211 foreach ($file_usage as $module => $usage) {
212 \Drupal::service('file.usage')->delete($entity, $module);
215 // Delete the actual file. Failures due to invalid files and files that
216 // were already deleted are logged to watchdog but ignored, the
217 // corresponding file entity will be deleted.
218 file_unmanaged_delete($entity->getFileUri());
225 public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
226 /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
227 $fields = parent::baseFieldDefinitions($entity_type);
229 $fields['fid']->setLabel(t('File ID'))
230 ->setDescription(t('The file ID.'));
232 $fields['uuid']->setDescription(t('The file UUID.'));
234 $fields['langcode']->setLabel(t('Language code'))
235 ->setDescription(t('The file language code.'));
237 $fields['uid'] = BaseFieldDefinition::create('entity_reference')
238 ->setLabel(t('User ID'))
239 ->setDescription(t('The user ID of the file.'))
240 ->setSetting('target_type', 'user');
242 $fields['filename'] = BaseFieldDefinition::create('string')
243 ->setLabel(t('Filename'))
244 ->setDescription(t('Name of the file with no path components.'));
246 $fields['uri'] = BaseFieldDefinition::create('file_uri')
248 ->setDescription(t('The URI to access the file (either local or remote).'))
249 ->setSetting('max_length', 255)
250 ->setSetting('case_sensitive', TRUE)
251 ->addConstraint('FileUriUnique');
253 $fields['filemime'] = BaseFieldDefinition::create('string')
254 ->setLabel(t('File MIME type'))
255 ->setSetting('is_ascii', TRUE)
256 ->setDescription(t("The file's MIME type."));
258 $fields['filesize'] = BaseFieldDefinition::create('integer')
259 ->setLabel(t('File size'))
260 ->setDescription(t('The size of the file in bytes.'))
261 ->setSetting('unsigned', TRUE)
262 ->setSetting('size', 'big');
264 $fields['status'] = BaseFieldDefinition::create('boolean')
265 ->setLabel(t('Status'))
266 ->setDescription(t('The status of the file, temporary (FALSE) and permanent (TRUE).'))
267 ->setDefaultValue(FALSE);
269 $fields['created'] = BaseFieldDefinition::create('created')
270 ->setLabel(t('Created'))
271 ->setDescription(t('The timestamp that the file was created.'));
273 $fields['changed'] = BaseFieldDefinition::create('changed')
274 ->setLabel(t('Changed'))
275 ->setDescription(t('The timestamp that the file was last changed.'));