如何从文件字段中提取文件名和FilePath? -- 7 领域 和 entities 领域 和 hooks 领域 和 files 领域 drupal 相关 的问题

How do I extract filename and filepath from a file field?


2
vote

问题

中文

这是我尝试解决的:我想允许通过默认的filefield上载内容类型上传zip文件。我正在使用hook_node_preSave拍摄zip文件,并从基于核心更新管理器的帮助函数中提取。我收到的错误是:

注意:未定义的索引:filefield_unzip_node_presave()中的文件名()(第18行) /sites/all/modules/filefield_unzip/filefield_unzip.module)。 注意:未定义的索引:filefield_unzip_node_presave()中的URI(第19行) /sites/all/modules/filefield_unzip/filefield_unzip.module)。 例外:归档者只能在本地文件上运行:> archiver_get_archiver()不支持(/包含/包含的行8149 /common.inc)。

这是我的代码:

  /** * @file  * Allows uploading and extracting a zip file uploaded to a file field. */  /**  *   * Implementation of hook_node_presave($node)  *   */  function filefield_unzip_node_presave($node) { if($node->type == 'game') {     if (!empty($node->field_game_files)) {         $zipFile = $node->field_game_files['und'][0]['filename'];         $zipDirectory = $node->field_game_files['und'][0]['uri'];          _filefield_unzip_archive_extract($zipFile, $zipDirectory);     } } }  /**  *   * Copy of the function used by the update manager update_manager_archive_extract($file, $directory)  *   */  function _filefield_unzip_archive_extract($file, $directory) { $archiver = archiver_get_archiver($file); if (!$archiver) {     throw new Exception(t('Cannot extract %file, not a valid archive.', array('%file' => $file))); }  //Remove the directory if it exists, otherwise it might contain a mixture of old files mixed with new files (e.g. in cases where files //were removed from a later release). $files = $archiver->listContents();  //Unfortunately, we can only use the direct name to determine the project name. Some archivers list the first file as the directory (i.e., MODULE/) //and others list an actual file (i.e., MODULE/README.TXT). $project = strtok($files[0], '/\');  $extract_location = $directory . '/' .$project; if (file_exists($extract_location)) {     file_unmanaged_delete_recursive($extract_location); }  $archiver->extract($directory); return $archiver; }   
英文原文

Here is what I am trying to tackle: I would like to allow a zip file to be uploaded via the default filefield upload widget for a content type. I am using hook_node_presave to take the zip file and extract is using a helper function based off of the core update manager. The error I am receiving is:

Notice: Undefined index: filename in filefield_unzip_node_presave() (line 18 of /sites/all/modules/filefield_unzip/filefield_unzip.module). Notice: Undefined index: uri in filefield_unzip_node_presave() (line 19 of /sites/all/modules/filefield_unzip/filefield_unzip.module). Exception: Archivers can only operate on local files: >not supported in archiver_get_archiver() (line 8149 of /include /common.inc).

Here is my code:

/** * @file  * Allows uploading and extracting a zip file uploaded to a file field. */  /**  *   * Implementation of hook_node_presave($node)  *   */  function filefield_unzip_node_presave($node) { if($node->type == 'game') {     if (!empty($node->field_game_files)) {         $zipFile = $node->field_game_files['und'][0]['filename'];         $zipDirectory = $node->field_game_files['und'][0]['uri'];          _filefield_unzip_archive_extract($zipFile, $zipDirectory);     } } }  /**  *   * Copy of the function used by the update manager update_manager_archive_extract($file, $directory)  *   */  function _filefield_unzip_archive_extract($file, $directory) { $archiver = archiver_get_archiver($file); if (!$archiver) {     throw new Exception(t('Cannot extract %file, not a valid archive.', array('%file' => $file))); }  //Remove the directory if it exists, otherwise it might contain a mixture of old files mixed with new files (e.g. in cases where files //were removed from a later release). $files = $archiver->listContents();  //Unfortunately, we can only use the direct name to determine the project name. Some archivers list the first file as the directory (i.e., MODULE/) //and others list an actual file (i.e., MODULE/README.TXT). $project = strtok($files[0], '/\\');  $extract_location = $directory . '/' .$project; if (file_exists($extract_location)) {     file_unmanaged_delete_recursive($extract_location); }  $archiver->extract($directory); return $archiver; } 
           
 
 

回答列表

1
 
vote

我发现了一个解决方案,但是Stackexchange不会让我添加8小时的答案。我有一切键入,所以如果我忘记回来上传,这里会在这里发布,请求答案并提醒我。

继续...

 

I found a solution to this, however stackexchange won't let me add an answer for 8 hours. I have it all typed out so if I forget to come back and upload it feel free to post on here to request the answer and remind me.

go on...

 
 
 
 
1
 
vote

好的,所以经过一些额外的挖掘,我终于找到了解决方案。

1)对于与未定义索引有关的前两个误差...

事实证明,整个文件对象尚未在hook_node_preSave中加载。这就是未定义文件名和URI的原因。此时,唯一可以确保在对象上设置的是文件的FID,它位于数据库中的File_Managed表中,并引用包含其余元数据的特定字段表。对于如何通过FID抓取文件并加载整个东西以及将其元数据一起加载到脚本中的一个很好的解释,可以在此处找到:更改文件字段的文件(Drupal 7)

2)第二个问题只是我的误读。使用Archiver_Get_Archiver函数时需要提供文件的完整路径,而不仅仅是$ FILE PARAPATER中的文件名(我是在$目录参数中包含路径的印象),然后用于$目录参数您替换您实际上希望将文件解压缩的位置。

请参阅下面的更新代码:

  <?php  /**  * @file   * Allows uploading and extracting a zip file uploaded to a file field.  */  /**  *   * Implementation of hook_node_presave($node)  *   */  function filefield_unzip_node_presave($node) {     if($node->type == 'game') {     //get fid from file_managed table in the DB     $fid = $node->field_game_files[$node->language][0]['fid'];     //load the file associated with this fid     $file = file_load($fid);      //get the full path to the file     $zipFile = $file->uri;     //remove the filename from the directory     $zipDirectory = dirname($file->uri);      if (!empty($node->field_game_files)) {         _filefield_unzip_archive_extract($zipFile, $zipDirectory);     } } }  /**  *   * Copy of the function used by the update manager update_manager_archive_extract($file, $directory)  *   */  function _filefield_unzip_archive_extract($file, $directory) { $archiver = archiver_get_archiver($file); if (!$archiver) {     throw new Exception(t('Cannot extract %file, not a valid archive.', array('%file' => $file))); }  //Remove the directory if it exists, otherwise it might contain a mixture of old files mixed with new files (e.g. in cases where files //were removed from a later release). $files = $archiver->listContents();  //Unfortunately, we can only use the direct name to determine the project name. Some archivers list the first file as the directory (i.e., MODULE/) //and others list an actual file (i.e., MODULE/README.TXT). $project = strtok($files[0], '/\');  $extract_location = $directory . '/' .$project; if (file_exists($extract_location)) {     file_unmanaged_delete_recursive($extract_location); }  $archiver->extract($directory); return $archiver; }   
 

Okay, so after some additional digging I finally found the solution.

1) For the first two errors relating to undefined indexes...

It turns out that the entire file object is not loaded yet in hook_node_presave. This is why filename and uri are not defined. The only thing you can be sure has been set on the object at this point is the file's fid which is located in the file_managed table in the database and references the specific fields table which contains the rest of the metadata. A good explanation for how to grab the file by its fid and load the entire thing along with its metadata into your script can be found here: Changing the file of a file field (drupal 7)

2) The second problem was just a misread on my part. When using the archiver_get_archiver function you need to supply the full path to the file, not just the filename in the $file paramater (I was under the impression that the path was included in the $directory parameter), and then for the $directory parameter you substitute the location you actually want the file to be unzipped to.

Please see below for the updated code:

<?php  /**  * @file   * Allows uploading and extracting a zip file uploaded to a file field.  */  /**  *   * Implementation of hook_node_presave($node)  *   */  function filefield_unzip_node_presave($node) {     if($node->type == 'game') {     //get fid from file_managed table in the DB     $fid = $node->field_game_files[$node->language][0]['fid'];     //load the file associated with this fid     $file = file_load($fid);      //get the full path to the file     $zipFile = $file->uri;     //remove the filename from the directory     $zipDirectory = dirname($file->uri);      if (!empty($node->field_game_files)) {         _filefield_unzip_archive_extract($zipFile, $zipDirectory);     } } }  /**  *   * Copy of the function used by the update manager update_manager_archive_extract($file, $directory)  *   */  function _filefield_unzip_archive_extract($file, $directory) { $archiver = archiver_get_archiver($file); if (!$archiver) {     throw new Exception(t('Cannot extract %file, not a valid archive.', array('%file' => $file))); }  //Remove the directory if it exists, otherwise it might contain a mixture of old files mixed with new files (e.g. in cases where files //were removed from a later release). $files = $archiver->listContents();  //Unfortunately, we can only use the direct name to determine the project name. Some archivers list the first file as the directory (i.e., MODULE/) //and others list an actual file (i.e., MODULE/README.TXT). $project = strtok($files[0], '/\\');  $extract_location = $directory . '/' .$project; if (file_exists($extract_location)) {     file_unmanaged_delete_recursive($extract_location); }  $archiver->extract($directory); return $archiver; } 
 
 
1
 
vote

无法查看完整的代码, 但您可以更改和使用以下代码来获取文件路径,

$imgpath = file_load($ifid)->uri; print file_create_url($imgpath);

希望它有助于

 

Couldn't review your complete code, but you can alter and use below code to get file path,

$imgpath = file_load($ifid)->uri; print file_create_url($imgpath);

hope it helps

 
 

相关问题

2  cache_menu项目是巨大的[关闭]  ( Cache menu items are huge ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并阐明编辑此帖子的问题。 关闭 7年前。 ...

0  通过另一个模块提供的功能定义常数?  ( Defining a constant via a function provided by another module ) 
在我的自定义模块中,我想定义一个常量,它从另一个模块提供的函数中取得其值。当我在我的模块中调用此函数时,我会收到"呼叫未定义的函数" 错误。奇怪的是,如果我从另一个函数内调用函数,我就不会出错,它工作正常。它好像所有模块函数同时加载,然后执行,但在功能可用之前首先执行任何不是函数的任何内容。 // MY_MODU...

0  是否可以使用WebForm的随机提交编号?  ( Is it possible to use random submission number for webform ) 
为了不允许用户知道提交了多少WebForms,可以通过随机范围增加 $sid $sid config。 ...

2  如何清洁缓存的缓存路径到模块?  ( How do i clean cached paths to modules ) 
我在更新模块时愚蠢地完成了这一点: # cd /var/www/drupal7/modules # mv MODULE MODULE.old # wget <MODULE_URL> -O - | tar xfvz - 刷新模块列表后,我仍然得到旧模块的版本,因为惊喜,它找到了module.old子目录。或者...

0  如何将分类术语添加为CSS类的视图? [关闭]  ( How can i add a taxonomy terms as a css class to my views ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并阐明编辑此帖的问题。 关闭 7年前。 ...

5  如何在代码中部署翻译?  ( How to deploy translations in code ) 
作为标题状态,我想在代码中导出翻译并使用像git等版本控制系统部署它。 我们有一个多语言Drupal系统(英语和德语),我们有本地化更新模块安装。 虽然某些模块甚至没有德语翻译,但有些则不足,有些翻译不是我们如何拥有它们。 所以我使用 admin/config/regional/translate/translate...

0  hook_field_schema未被使用  ( Hook field schema not being used ) 
我正在尝试使用其他属性(或列)创建一个字段,以定义与分类学期的额外关系。 我在我的模块文件中有这个: /** * Implements hook_field_info(). */ function emtr_field_info() { return array( // We name...

2  如何为自己的自定义模块编写视图? [关闭]  ( How to write views for our own custom module ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并通过编辑此帖子问题。 关闭 7年前。 ...

0  如何设置分类学术语活动?  ( How to set a taxonomy term active ) 
在我的块中,我有不同的分类学期: 术语A. -Term B. - 克里姆C. ---术语D. 当我在第b上时,如果我在术语D上,则设置为活动或粗体,然后它被设置为活动和粗体。 这已被使用 $options = array(); if (arg(0) == 'taxonomy' && arg(1) == 'term...

0  Drupal在视图中删除我替换模式的令牌的令牌的个别段落标签  ( Drupal remove individual paragraph tags of the tokens of my replacement patterns ) 
我要为重写结果在查看和使用替换模式可以做到这一点。的问题是,当我此做的 2个令牌被显示在单独的一段。 - &gt; [查看_conditional] [field_blg_inhoud] 我现在有什么: Views_conditional文本 field_blg_inhoud text 我想要什么: Vie...

0  强制页面在叠加层中打开  ( Force page open in overlay ) 
我想强迫管理页面仅打开,仅在叠加层中打开。如您所知,如果单击与管理路径的链接,则会在覆盖中打开(如果已启用)。但如果将URL写入浏览器,或者使用一些深链接,或者您已经在管理主题中,则预计链接将不会在叠加层中打开。 如何强制页面,即使将URL输入到浏览器的路径,也可以在叠加层中打开。 例如,如果我在浏览器中键入: ...

2  在定义自定义实体使用的字段类型时无法禁用模块  ( Cant disable module when it defines an field type used by a custom entity ) 
我已创建一个创建自定义实体的模块(使用 hook_entity_info 等),定义字段类型(使用 hook_field_schema 和 hook_field_info ),然后用我的自定义实体创建字段类型的实例(使用 field_create_field 然后 field_create_instance )。 这...

1  如何重用查询条件?  ( How to reuse query conditions ) 
我有一个半新的Drupal 7网站,其中管理员批准了管理者的账目,管理人员批准其员工的帐户。这都是很好的。我被要求制作它,以便管理者可以删除不再需要的员工帐户。 使用我们的旧CMS,当我们所有的SQL都写着时,我可以构建一个"在哪里" 语句,如: $cWhere = "WHERE e.department = ...

2  如何了解哪些上下文反应正在射击?  ( How to find out which context reaction is firing ) 
im创建一些具有针对平板电脑和手机布局的页面,用于使用上下文,上下文断点和三角形发送目标视图和模板。 但是我需要某种方式看到像一些页面上被解雇的那样的上下文反应是发生了无尽的自动重新加载,我认为可能是由于一些具有多种反应的路径,所以我正在寻找某种方式来看反应被烧制并获得越野车 ...

1  如何使用commerce_cart_order_product_line_item_delete?  ( How to use commerce cart order product line item delete ) 
我已经设置了自己的自定义模块结构,我正在尝试实现Commerce_Cart_Order_Product_Line_Item_delete。在它是最基本的层面,我正在尝试在我的购物车中的订单1中删除行项目70,我的模块中的以下代码: <?php commerce_cart_order_product_lin...

0  如何获取OG组菜单块以查看视图中?  ( How do i get an og group menu block to appear in view ) 
使用 OG 7.x-2.3 和 OG Menu 7.x-3.0-rc4 。我已为组菜单添加了一个列出组中的所有内容的视图。我想要的只是在执行视图时显示组菜单块。 我在 hook_views_pre_view 中添加了代码,以在执行视图时维护组上下文。 我还尝试通过为视图创建此URL路径来利用 OG URL Grou...

1  使用图像中的链接打开特定视图节点  ( Open a specific view node with a link in an image ) 
我已经陷入了困难。我甚至不确定如何询问正确的问题来搜索答案。 我所拥有的是在画廊中的用户帐户图像的视图。到现在为止还挺好。我还有另一个视图呈现为节点的所有用户帐户字段。到目前为止也很好。 我想点击图库中的用户映像,然后在另一个视图中直接转到该用户节点。 问题没有将URL附加到图像,而是启用顺序URL来调用正确的视图节...

1  使用另一种表单表单提交页面  ( Form submit to page with another form ) 
我正在尝试从一个页面提交,该页面具有与形式的另一个动态页面的表单。正如你在钩子菜单中看到的那样,我正在使用 drupal_get_form 作为回调,我认为这通常会工作,因为我能够进入第一个形式没有任何问题。 我确实注意到我在提交到URL时收到此错误,该页面根本不呈现第2个表单或者我在函数中的内容在2nd形式中显示。...

-2  模块连续旋转内容  ( Module to rotate the content continously ) 
任何一个人知道如何在没有暂停的情况下连续地从下向向上方向旋转特定内容类型的内容。 内容应连续旋转在一起。我使用了 viewTicker 和 view slideshow 和 content glider 模块。 请告诉我其他模块。 ...

1  Drupal未显示的子菜单项  ( Child menu items not displayed in drupal ) 
我是这样的子菜单: 我正在尝试构建自定义主题,我刚刚复制其中包含以下代码: <?php if ($main_menu || $secondary_menu): ?> <div id="navigation"><div class="section"> <?php print theme('lin...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.