Drupal 7 开发内部培训资料, 分头诗人

如何让Drupal支持大文件上传以及下载?文件下载时,如何防止图片和pdf格式的文件直接在浏览器打开?

赞成!
0
否决!

我想做一个大文件上传下载的功能,但文件上传之后,下载时候图片和pdf文件会直接在浏览器打开,我测试过download_file和 file_force两个模块,虽然这两个模块都可以实现防止文件在浏览器直接打开,但是测试比较大的文件下载时候,下载就会出错了,例如下载中断,下载下来的文件不完整,求帮忙解决这个问题,万分感激,谢谢!   还有我测试download这个模块时候,我想实现多文件同时压缩打包下载,结果发现如果所压缩打包的文件超过150MB大小,就出错。

2 个回答

赞成!
0
否决!

drupal 是运行在php环境的,所以在这个drupal环境的文件也是在php环境中,php 有一个 参数 :maximum execution time,最长执行时间,大文件通常执行时间超过,所以导致下载不完整,换句话说,这个跟drupal其实没关系的。当然,也可以通过自定义一个drupal 模块来实行简单的drupal 系统改造,让他支持大文件上传跟下载。

 

1,上传大文件。

上传的文件中,drupal会默认在 file_managed 表中记录,drupal 默认的系统模块是通过hook_schema 声明一个表的字段:

'filesize' => array(
  'description' => 'The size of the file in bytes.', 
  'type' => 'int', 
  'unsigned' => TRUE, 
  'not null' => TRUE, 
  'default' => 0, 
), 

这个写法只能支持2GB的文件,mysql默认就是2147483647字节,如果超过这个大小就会报错。

这是因为drupal 运行 file_save 函数的时候,$file->filesize 的值大于临界值造成的。

我们可以通过 hook_installhook_uninstall 来修改filesize字段的大小,最好同时应用在hook_schema_alter

/**
 * Implements hook_install() 
 */
function seedbox_install() {
  db_change_field('file_managed', 'filesize', 'filesize', array('type' => 'int', 'size' => 'big',)); 
} 

 

/** 
 * Implements hook_uninstall() 
 */
function seedbox_uninstall() {
  db_change_field('file_managed', 'filesize', 'filesize', array('type' => 'int', 'size' => 'normal',));
} 

 

/** * Implements hook_schema_alter */
function seedbox_schema_alter(&$schema) {
  if (isset($schema['file_managed'])) {
    $schema['file_managed']['fields']['filesize'] = array('type' => 'int', 'size' => 'big', );
  }
} 

 

第一个函数的作用是让filesizeINT变成BIGINT,就能支持大文件,大约是9.2EB,足够大了。第二个函数作用是,当卸载了这个自定义模块后,把表的字段变回系统默认。

 

2,下载大文件。

可以改变file_transfer,设定set_time_limit(0); 来实现。

/**
 * Implements hook_file_download() 
 * Due to the large size of some files it is necessary 
 * to remove the restriction imposed by PHP on the length 
 * of time it takes to execute this transaction. 
 * Currently set to unlimited time, this could be altered 
 * in an admin interface potentially 
 */
function seedbox_file_download($uri) {
  if (file_uri_scheme($uri) == 'seedboxdownload') {
    drupal_set_time_limit(0);
  }
}
赞成!
0
否决!

诗人,因为我是新手,所以不是很明白,能否再详细说下步骤?谢谢诗人