1. Drupal的文件目录分类
Drupal的文件API分为unmanaged file和managed file两种类型,managed file会在数据库中记录文件的信息及引用记录。
Drupal文件对象有一个uri属性,它的形式如public://myfile.jpg,通过file_create_url($file->uri)可以把uri转换成web可访问的路径,如http://howto.eguidedog.net/sites/default/files/myfile.jpg
Drupal内建了public、private和temporary流报装器(stream wrapper),PHP文件操作函数可以直接操作这些uri,例如我们可以通过filesize(‘public://myfile.jpg')获取文件大小,而不需要先转换成本地文件的地址。
Drupal中的private目录应该是放在一个不能直接从Web访问的目录,其内容通过PHP返回(这里有一个副作用是增加了系统开销)。
2. 怎样保存managed file类型文件
$entity_type = 'node';
$entity_id = 1; // Node ID,如果是考试,可以填考试ID。这个字段主要是标记文件和什么东西有关。不要填创建者的用户ID,因为这个信息在file_managed表里已经有了。
$fid = 1; // The file ID
$file = \Drupal\file\Entity\File::load($fid);
$file_usage = \Drupal::service('file.usage');
$file_usage->add($file, 'mymodule', $entity_type, $entity_id);
3. 怎样删除managed file类型文件
$file_usage->delete($file, 'mymodule', $entity_type, $entity_id);
$file = File::load($fid);
if ($file) {
$file->delete();
}
4. 把内部URI转外成外部URL
$url = \Drupal::service('file_url_generator')->generateAbsoluteString($zipPath);
5. 把内部URI转换为链接
$drupalUri = QuestionReview::saveZip($gid);
$httpUrl = \Drupal::service('file_url_generator')->generateAbsoluteString($drupalUri);
\Drupal::messenger()->addMessage(Markup::create('文件已生成,请' . Link::fromTextAndUrl('点击下载',
Url::fromUri($httpUrl))->toString()));
6. Ajax表单下载文件
一个表单直接submit是可以返回文件的,但是如果是Ajax表单方式提交则不可以。但有个技巧可以解决。在submit处理完成的时候把文件的URL设置在form_state里,然后在ajaxCallback获取该URL,之后返回一条重定向页面的Ajax命令即可。
public static function ajaxCallback(array $form, FormStateInterface $form_state) {
$response = new AjaxResponse();
$url = $form_state->get('url');
$response->addCommand(new RedirectCommand($url));
return $response;
}
参考:
评论