如何使Blob文件可下载? -- 7 领域 和 files 领域 drupal 相关 的问题

How to make blob file downloadable?


1
vote

问题

中文

我已经创建了一个模块,以在Drupal 7中可用于下载Blob文件。

在我的代码下面.module文件

  <?php  function blobfile_block_info() {   $blocks = array();   $blocks['blobfile_block'] = array(     'info' => t('Blob Files Download'),   );    return $blocks; }  function blobfile_block_view($delta) {            $query = db_select('health_policy_document_upload_dtl', h)->fields('h');       $result = $query->execute();        $content ='';       while($record = $result->fetchAssoc()) {            $filename = $record['Document_Name'];           $file     = $record['Document'];           $type     = $record['Document_Type'];           $size     = filesize($file);             header("Content-length: $size");           header("Content-type: $type");                     header("Content-Disposition: attachment; filename=$filename");            $content .= "<a href='#'>".$filename."</a>";           $content .= "<br>";       }      return array(       'subject' => t('Bids'),       'content' => $content     );     }   

请指导我出错的地方。

英文原文

I have created a Module to make blob file available for Download in Drupal 7 .

Below my code for .module file

<?php  function blobfile_block_info() {   $blocks = array();   $blocks['blobfile_block'] = array(     'info' => t('Blob Files Download'),   );    return $blocks; }  function blobfile_block_view($delta) {            $query = db_select('health_policy_document_upload_dtl', h)->fields('h');       $result = $query->execute();        $content ='';       while($record = $result->fetchAssoc()) {            $filename = $record['Document_Name'];           $file     = $record['Document'];           $type     = $record['Document_Type'];           $size     = filesize($file);             header("Content-length: $size");           header("Content-type: $type");                     header("Content-Disposition: attachment; filename=$filename");            $content .= "<a href='#'>".$filename."</a>";           $content .= "<br>";       }      return array(       'subject' => t('Bids'),       'content' => $content     );     } 

Please guide me where I went wrong.

     
   
   

回答列表

0
 
vote

我假设您已经提出了一个解决方案来上传文件并将它们放在数据库中,并且您有一个很好的原因不使用Drupal内置文件处理(我质疑特别给出的第二个假设对健康政策的参考,但我会授予它)。

您创建的块需要只提供链接列表,但您不应该在那里设置标题,只需生成链接即可。该链接可能是诸如:/ custom_files / [filename]的形式(或基于完整上下文更清晰的内容。

首先,您需要一个 hook_menu() 定义菜单路由器以获取您的文件。类似:

  function mymodule_menu() {   $items['custom_files/%mymodule_filename'] = array(     'page callback' => 'mymodule_filedownload',     'page arguments' => array(1),     'delivery callback' => 'mymodule_file_delivery',   ); }   

您还应该在此处添加一些处理处理的权限,hook_menu()上的文档介绍了它的工作原理。还阅读了"交付回调" 部分,因为这些也具有安全影响,我正在掩盖。

接下来,您需要页面回调函数实际发送文件:

  function mymodule_filedownload($mymodule_filename) {    // Validate permissions ...    // Validate filename ...    // Load file object from database     $query = db_select('health_policy_document_upload_dtl', h)->fields('h')->condition('filename', $mymodule_filename,'=');   $result = $query->execute();     // Prep an array to hand data off to the delivery callback. It might just be the results, but often you want to tweak details... ...   return $file_data_array;  }  function mymodule_file_deliver($file_data) {    // Check $file_data to see if this is a valid file or an error of some kind. ...   // Process and errors found and send proper error response. ...    // Send file   drupal_add_http_header("Content-length: ".$file_data['size']);   drupal_add_http_header("Content-type: " .$file_data['type']);   drupal_add_http_header("Content-Disposition: attachment; filename=".$file_data['filename']);     print($file_data['data']);     drupal_page_footer(); }   
显然,很多细节在这里都很亮。除了Hook_Menu()的文档外,您可能还想要读取 drupal_deliver_html_page() 。注意使用 drupal_add_http_header() 而不是PHP的<代码> header() ,对于大多数基本任务,Drupal具有内部功能,提供一些清理和标准化,以避免基本错误和与其他模块的冲突;你应该尽可能使用它们。
 

I'm assuming you have already come up with a solution to upload the files and put them in the database, and that you have a good reason not to use Drupal's built-in file handling (I question that second assumption particularly given the reference to health policy but I'll grant it).

The block you created needs to just provide the list of links, but you should not set the headers there, just generate the links. The link should probably be in the form of something like: /custom_files/[filename] (or something clearer based on your complete context.

First you need a hook_menu() to define the menu router to get your files. Something like:

function mymodule_menu() {   $items['custom_files/%mymodule_filename'] = array(     'page callback' => 'mymodule_filedownload',     'page arguments' => array(1),     'delivery callback' => 'mymodule_file_delivery',   ); } 

You should also add some permissions handling here, the documentation on hook_menu() explains how that works. Also read the section on deliver callbacks because those also have security implications I'm glossing over.

Next you need the page callback function to actually send the file:

function mymodule_filedownload($mymodule_filename) {    // Validate permissions ...    // Validate filename ...    // Load file object from database     $query = db_select('health_policy_document_upload_dtl', h)->fields('h')->condition('filename', $mymodule_filename,'=');   $result = $query->execute();     // Prep an array to hand data off to the delivery callback. It might just be the results, but often you want to tweak details... ...   return $file_data_array;  }  function mymodule_file_deliver($file_data) {    // Check $file_data to see if this is a valid file or an error of some kind. ...   // Process and errors found and send proper error response. ...    // Send file   drupal_add_http_header("Content-length: ".$file_data['size']);   drupal_add_http_header("Content-type: " .$file_data['type']);   drupal_add_http_header("Content-Disposition: attachment; filename=".$file_data['filename']);     print($file_data['data']);     drupal_page_footer(); } 

Obviously lots of details are glossed over here. In addition to hook_menu()'s documentation you likely will also want to read drupal_deliver_html_page(). Note the use of drupal_add_http_header() instead of PHP's header(), for most basic tasks Drupal has internal functions that provide some clean up and standardization to avoid basic mistakes and conflicts with other module; you should use them whenever possible.

 
 

相关问题

0  如果字段是自动完成的字段,则以编程方式保存节点字段?  ( Programatically save node fields if fields is autocomplete ) 
我已经创建了一个包含3个字段的内容类型,我的一个字段是node_refrence在此文件中,我使用node_refrence填充其他节点的标题。 我正在使用这个代码。 > $node = new stdClass(); $node->type = 'application'; > node_object_pr...

1  如何引用自定义字段到内容类型条目  ( How to reference a custom field to content type entry ) 
在Drupal 7中我创建了一个"产品" 内容类型和自定义模块,它创建了一个具有字段"产品" 的实体"订单" 。 我想用来自内容类型的产品引用我的字段"产品" 。 任何建议如何使其审理? ...

0  在没有任何HTML标记的情况下获得清洁日期  ( Get clean date without any html tags ) 
我正在使用日期模块以及显示日期的视图,我需要获取日期时间戳。问题是 $fields['date_in_timestamp'] 内容在html包装。 <span class="date-display-single"> 1468473300 </span> 我只需要值,没有html。 ps:我的字段"dat...

6  Drupal_static的预期用途是什么?  ( What is the intended use of drupal static ) 
我理解Drupal静态缓存用于存储内存中的静态值,以便更快地访问它们的要求。然而,在德鲁佩尔和贡献的模块中,我倾向于看到两个不同的版本: 示例来自 drupal_is_front_page : function drupal_is_front_page() { // Use the advanced dru...

1  如何在规则操作中替换关于[node:url]的文本吗?  ( How to replace text about nodeurl within a rules action ) 
我正在使用规则模块,并在保存新时创建规则内容,发送电子邮件包含节点标题,以及节点的URL。非常直接。也就是说,我想在发送的消息之前替换网址中的文本。我正在使用str_replace(),但它不起作用。 任何建议? 更新: 路径当前看起来像这样: domain.com/cron.php/newsroom/press-...

0  单击链接时,从表中检索值并显示在WebForm字段上  ( When a link is clicked a value is retrieved from the table and displayed on a w ) 
我创建了一个带有两个按钮的基本页面,"是" 和"否" 。单击"是" 按钮时,它将引导到WebForm。 目的:当出现WebForm时,它会将表中的值显示为字段。 数据库 表名:房间 领域:房间 数据:培训室 基本页 webform 我为此功能创建了一个模块: test_presa...

0  devel dpq()不起作用?  ( Devel dpq not working ) 
我正在尝试打印从视图生成的SQL,但它不起作用。以下是我获得的错误消息: - Fatal error: Call to a member function arguments() on a non-object in /var/www/Exaxmple-Site/sites/all/modules/devel...

1  从自定义URL删除语言前缀  ( Remove language prefix from custom url ) 
我们的网站存在于多种语言中。我已安装XMLSitemap模块和默认链接看起来像SitEname / en / sitemap.xml 我需要删除此链接的语言前缀。似乎没有设置为任何特定的自定义链接禁用翻译。 可以是我可以以编程方式做到这一点? ...

1  在不使用拖放的情况下编辑块的权重  ( Edit weight of block without using drag and drop ) 
我正在尝试重新排序块。我明白它可以通过拖放块结构页面拖放来完成,但是我有一个限制。 保存时,订单不会保存。这很可能是因为存在非常大量的块,服务器无法以一种形式处理许多输入。所以它只是恢复到它的原始位置。我无法访问服务器,因此我无法进行更改以允许服务器处理许多输入。 我也无法访问MySQL数据库。 我希望能够在块中手动...

2  如何为从未访问一个站点的用户创建视图过滤器?  ( How to create a views filter for users who have never accessed a site ) 
我有一个景观,我正在尝试显示所有具有 never 的上次访问值的用户,这意味着它们从未登录过。 滤波器期望日期值对我没有帮助,因为我只需要通过从未访问的用户过滤。 任何人都知道围绕这个方法吗? ...

2  如何看到*哪个用户*最后更新了一个节点?  ( How do i see which user last updated a node ) 
在 admin/content 中,我如何覆盖这个显示屏列表上次更新一段内容的用户。我们可以看到最初的作者,这很好。但我想要一个触摸节点的跑步道。 我尝试了什么 修订:但是,某些内容类型使用jQuery选项卡的字段,在返回某一修订时丢失其内容。 ...

2  如何使用外部JSON API创建/更新节点的字段?  ( How to use external json api to create update nodes fields ) 
我有一个内容类型: siteinfo 。 此内容类型具有多个字段:文本,实体参考等。 我想使用外部API自动填充创建节点的某些字段。 我想要使用的API说: API返回XML&amp中的一致和结构​​良好的数据;杰森 格式。返回的数据包含可容易的解析字段 您的申请使用。这是一个基于RES的API。 ...

1  WebForm草案共享链接  ( Webform draft share link ) 
我想创建一个接受两方输入的WebForm。第一方填写了表格的一部分,并与第二方分享了与其余的联系。 我已找到对此服务有用的"保存草稿" 功能,但仅加载PreS保存的信息。无论如何我可以共享一个链接(基于SID),以便每当URL具有SID参数时,它会加载预保存的信息? 感谢 ...

0  类似/相关标签块  ( Similar related tags block ) 
有很多方法可以根据其标签构建类似的内容块。是否有任何方法可以构建类似的标签块? 我尝试构建类似/相关的标签块。 我想查看他们拥有的内容和常见标签。他们一起添加了多少次。这样的东西: 例如:对于First Column Green类似于蓝色。对于绿色的第三列黄色和蓝色。 ...

0  使用自定义模块从基本页面存储URL  ( Storing a url from a basic page using a custom module ) 
我在 http://example.com/[company ] / [客户]?ID = 2 。我想将此URL存储在自定义模块中的字符串操作的全局变量中。 我通过使用 hook_form_alter() webform 来取得成功检索URL,但我不知道如何为基本页面做同样的事情。 我需要使用哪个钩子? ...

3  通过自定义表格传递参数  ( Pass argument in view from custom form ) 
我有一个查看内容页面。我想在自定义表单数据的基础上过滤其内容。 所以我们如何使用自定义表单数据来通过或过滤视图内容? 视图构建在节点上。在此特定节点中,我们有一个字段类型选择列表。 我们在我们的表单中创建的相同选择列表。现在以表单选择了什么选择,我们希望在视图中使用它的值。 我们也没有想法如何使用它的价值。 ...

2  menu_tree_all_data()返回自定义菜单的空数组  ( Menu tree all data returns empty arrays for custom menus ) 
这是作品。 $tree = menu_tree_all_data('main-menu'); 这不起作用。 $tree = menu_tree_all_data('menu-health-center'); 为什么<代码> function events_theme($existing, $typ...

1  如何数据比较Ubercart的价格或小计量级运输报价  ( How to data compare the price or subtotal in ubercart flat rate shipping quotes ) 
使用drupal 7.43和 ubercart 7.3.9 我试图为两个参数设置平面运输。 用于小计以上$ 34.00 的订单 用于小计以下34.00美元的订单 不幸的是,小计的数据比较下没有任何选项......只有订单总数。 或者,我想创建一个由价格范围而不同的固定利率运费。 价格高于34.00美元的产品 ...

2  读取字段值并将其传递给仅针对节点页面的段样式Atributes  ( Read field value and pass it to section style atributes only for node page ) 
我在内容类型中有一个颜色字段 - &gt;页面字段。我想读取此字段的值,并将此值传递为主内容的元素的背景颜色(Bootstrap Subtheme)( - 从页面,TLP.php)。并且仅适用于节点类型 - &gt;页面。 在我的template.php中,我试图使用函数theme_preprocess_page。我...

1  如何将饲料内容导入书籍的子页面?  ( How to import feed content as child pages of a book ) 
我能够使用csv和feed导入导入节点,但我希望导入的内容是特定书的子页面。怎么办? ...




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


Licensed under cc by-sa 3.0 with attribution required.