File Drupal上传然后移动不';t更新文件列表中的路径或文件名

File Drupal上传然后移动不';t更新文件列表中的路径或文件名,file,drupal,File,Drupal,我有一个自定义表单,使用一个“托管_文件”上传到临时文件夹。然后以编程方式加载该文件并将其移动到其永久存储器(用*名称覆盖任何现有文件),例如 所有这些工作(即文件以正确的名称实际移动到正确的位置);但是,列表中显示的文件(即/admin/content/files)仍然将不正确的临时文件夹显示为URI 基本上,listings页面中的文件似乎显示了先前成功移动的*文件的原始文件路径和名称* 如果我用不正确的URI加载此文件,即使用不正确的临时路径,则会加载数据,但随后将不会有文件信息(因为它不

我有一个自定义表单,使用一个“托管_文件”上传到临时文件夹。然后以编程方式加载该文件并将其移动到其永久存储器(用*名称覆盖任何现有文件),例如

所有这些工作(即文件以正确的名称实际移动到正确的位置);但是,列表中显示的文件(即/admin/content/files)仍然将不正确的临时文件夹显示为URI

基本上,listings页面中的文件似乎显示了先前成功移动的*文件的原始文件路径和名称*

如果我用不正确的URI加载此文件,即使用不正确的临时路径,则会加载数据,但随后将不会有文件信息(因为它不存在。此外,单击列表下的浏览器文件名将显示“未找到页面”和显示旧URL的URL,即/system/temporary?file=XYZ.pdf)

如果我通过正确的URI加载此文件,即使用正确的目标路径,则找不到文件-如果我直接在浏览器中转到该路径,则相同


托管文件似乎不知道它已被移动。如何解决此错误?

事实证明,基于类的方法不会更新数据库

程序性版本确实如此

比如说“将文件移动到新位置而不更改数据库或调用钩子。”

因此,您需要使用新值更新文件实体。
尝试以下未经测试的方法:

// Upload file
$upfile = $this->entityTypeManager->getStorage('file')->load($fid);

// Source and destination
$sourceUri = $this->fileSystem->realpath($upfile->getFileUri());
$destinationUri = $this->fileSystem->realpath(\Drupal::config('system.file')->get('default_scheme') . "://") . '/x/y/z/XYZ_NEW.pdf';

// Move and overwrite
$newFileName = $this->fileSystem->move($sourceUri, $destinationUri, FileSystemInterface::EXISTS_REPLACE);

// Set the new file path on the file entity.
$upfile->setFileUri($newFileName);

// Set the file to permanent if needed.
$upfile->setPermanent();

// Save entity with changes.
$upfile->save();
不过,我没有对此进行测试。

您可以在

中检查文件实体上的函数顺便说一句,清除缓存或运行cron并不能解决问题*谢谢。唯一一个似乎没有太多文档的部分。。。首先保存文件。然后使用该ID保存媒体项(例如字段\媒体\文档)。之后,获取此媒体id并将其保存到节点。我看到一些情况下,他们这样做;但是,它们将原始文件id保存到节点,而不是媒体id。不确定这是否是一个问题。我想媒体id是正确的过程。(不确定如何标记为正确答案。似乎我们同时发布了)…哈哈,耶,不用担心,你的方式可能更简单。
// Upload file
$upfile = $this->entityTypeManager->getStorage('file')->load($fid);

// Source and destination
$sourceUri = $this->fileSystem->realpath($upfile->getFileUri());
$destinationUri = $this->fileSystem->realpath(\Drupal::config('system.file')->get('default_scheme') . "://") . '/x/y/z/XYZ_NEW.pdf';

// Move and overwrite
$newFileName = $this->fileSystem->move($sourceUri, $destinationUri, FileSystemInterface::EXISTS_REPLACE);

// Set the new file path on the file entity.
$upfile->setFileUri($newFileName);

// Set the file to permanent if needed.
$upfile->setPermanent();

// Save entity with changes.
$upfile->save();