drupal7 开发自定义上传、下载模块的上传功能

时间:2024-06-19 13:07:50

关键点有两个:1.在页面上显示出上传的控件,2.代码实现文件上传到服务器的功能

一、显示控件:

先来看关键点1: 实现页面显示出上传控件, 关键代码:

 $form['my_file_field'] = array(
'#type' => 'managed_file',
'#title' => '文件',
)
);

做过上传的功能的人,会发现上面的代码值能实现在页面显示上传控件,但是没有限制上传大小。另外需要注意的是,上传的路径和格式也必须在定义该控件的时候指定。完整的上传控件的代码实现:

define("UPLOAD_Base_Path", "public://myfilezjf");
$str_upload_extend='doc docx xls xlsx ppt pptx ';//这里写允许的上传格式
$SIZE_M=8;//限制大小,单位M
$form['my_file_field'] = array(
'#type' => 'managed_file',
'#title' => '文件',
'#description' => '格式限制:'.$str_upload_extend.' 大小限制:'.$SIZE_M.'M以内',
'#upload_location' => UPLOAD_Base_Path,
'#upload_validators' => array(
'file_validate_extensions' => array($str_upload_extend),//限制上传文件后缀
// Pass the maximum file size in bytes
'file_validate_size' => array($SIZE_M*1024*1024),//限制大小
)
);

二、上传代码具体实现关键点:2:实现上传的具体代码:

 function uploadview_form_submit($form, &$form_state){
// Load the file via file.fid.
$file = file_load($form_state['values']['my_file_field']);
$file->status = FILE_STATUS_PERMANENT;
file_save($file); drupal_set_message('保存成功');
}

需要特别说明一下的是,第4行代码,就是为文件制定了satus=1,即永久保存的文件,不会被drupal自动删除;否则是status=0,指的是临时文件,会被drupal定期自动删除

三、完全意义上的实现

到前面两步,我们已经实现了上传的功能,但是怎么查看上传的文件列表,从而进行下载和管理呢?就是你怎么从数据库中查出你做额这个页面的上传的文件呢?

这里我们需要了解,凡是上传的文件都会在file_manage表中保存一条记录,上面说到的status就是该表的属性之一,下面就是一条该表的记录:

drupal7 开发自定义上传、下载模块的上传功能

但是其他模块上传的文件也会在这张表中留下痕迹,怎么区分呢?目前我能给出的方案就是,单独再建立一张表,两张表进行关联,表结构为:fid int(10) PK, title varchar(255)

完整代码如下:

3.1 upload.module文件:

<?php 

function upload_menu()
{
$items=array(); //管理列表
$items['admin/upload']=array(
'title' => '上传',
'description' => '上传',
'page callback' => 'manage_upload_list',
'access arguments' => array('access content' ),
'type' => MENU_NORMAL_ITEM,
'file' => 'upload.admin.inc',
); //进行上传
$items['upload']=array(
'title' => '上传--测试',
'description' => '上传',
'page callback' => 'drupal_get_form',
'page arguments' => array('uploadview_form'),
'access arguments' => array('to upload' ),
'type' => MENU_NORMAL_ITEM,
'file' => 'upload.pages.inc', ); //下载列表
$items['upload/list']=array(
'title'=>'下载列表',
'description' => '下载列表',
'page callback' => 'download_list',
'access arguments' => array('to upload' ),
'type' => MENU_NORMAL_ITEM,
'file' => 'upload.pages.inc',
); //删除
$items['admin/upload/%/delete']=array(
'title'=>'删除',
'description'=>'删除',
'page callback'=>'drupal_get_form',
'page arguments'=>array('upload_delete_confirm',2),
'access arguments' => array('manage upload' ),
'type' => MENU_NORMAL_ITEM,
'file' => 'upload.admin.inc', ); return $items;
} function upload_permission(){
return array(
'manage upload'=>array(
'title'=>t('管理下载权限')
),
'to upload'=>array(
'title'=>t('进行上传')
), );
} function upload_block_info()
{
$blocks['upload_download']=array(
'info'=>t('下载区域'),
'weight'=>1,
'status'=>1,
'region'=>'Sidebar first'
);
return $blocks;
} function upload_block_view($delta='')
{
$block=array(); switch ($delta)
{
case 'upload_download':
$block['subject']='下载';
$block['content']=get_mydownload_block();
break;
}
return $block;
} function get_mydownload_block()
{ $str_query="SELECT c_f_u.fid AS fid, c_f_u.title AS title, f_m.uri AS uri, f_m.filename AS filename
FROM
custom_file_upload c_f_u
INNER JOIN file_managed f_m ON c_f_u.fid=f_m.fid
ORDER BY f_m.timestamp DESC
LIMIT 10 OFFSET 0 "; $content = db_query($str_query); $lists=array(); $output='<div class="item-list">';
$_count=1;
if ($content) {
$output.='<ul>';
$length=count($content);
foreach ($content as $data)
{
$class='';
if($_count==1) {//第一个
$class='class="first"';
}
elseif ($_count==$length)//最后一个
{
$class='class="last"';
} $url_head='http://'.$_SERVER['HTTP_HOST'].'/drupal755/sites/default/files/';
$url=$url_head.ltrim($data->uri,'public://');
$html_h=l($data->title,$url);
$output.='<li '.$class.'>'.$html_h.'</li>';
$_count++;
}
$output.='</ul>';
}
else
{
$output.='<p>No Content</p>';
}
$output.='</div>'; if ($_count>=5) {
$url='http://'.$_SERVER['HTTP_HOST'].'/drupal755/upload/list';
$output.='<div style="text-align:right;width:100%">'.l('更多>>',$url).'</div>';
} return $output;
} function upload_theme(){
return array(
'hoyand_paiko_thumb_upload' => array(
'render element' => 'element',
),
);
}

3.2 upload.pages.inc文件

<?php

define("UPLOAD_Base_Path", "public://myfilezjf");

function  uploadview_form($form, &$form_state){
//gif png jpg jpeg txt
$str_upload_extend='doc docx xls xlsx ppt pptx ';//这里写允许的上传格式
$SIZE_M=8;//限制大小,单位M
$form['my_file_field'] = array(
'#type' => 'managed_file',
'#title' => '文件',
'#description' => '格式限制:'.$str_upload_extend.' 大小限制:'.$SIZE_M.'M以内',
'#upload_location' => UPLOAD_Base_Path,
// '#default_value' => empty($user->picture->fid) ? 0 : $user->picture->fid,
// '#theme' => 'hoyand_paiko_thumb_upload', //留意这个我们为他增加了一个theme
'#upload_validators' => array(
'file_validate_extensions' => array($str_upload_extend),//限制上传文件后缀
// Pass the maximum file size in bytes
'file_validate_size' => array($SIZE_M*1024*1024),//限制大小
)
); $form['title']=array(
'#type'=>'textfield',
'#title'=>t('名称'),
'#size' => 30,
'#required' => TRUE,
); // Add the buttons.
$form['buttons'] = array();
$form['buttons']['#weight'] = 100;
$form['buttons']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
'#weight' => 5,
'#submit' => array('uploadview_form_submit'),
'#prefix' => '<div >',
'#suffix' => '</div>',
); $form['#validate'][] = 'pk_settings_form_validate'; return $form;
} function uploadview_form_submit($form, &$form_state){
// Load the file via file.fid.
$file = file_load($form_state['values']['my_file_field']);
$file->status = FILE_STATUS_PERMANENT;
file_save($file); insert_customfile($file->fid,$form_state['values']['title']);//插入custom_file_upload表
drupal_set_message('保存成功');
} function insert_customfile($fid,$title="")
{ db_insert('custom_file_upload')
->fields(
array(
'fid'=>$fid,
'title'=>$title
)
)->execute();
} function pk_settings_form_validate($form, &$form_state) { } function download_list()
{ $query = db_select('custom_file_upload','c_f_u');
$query->join('file_managed','f_m','c_f_u.fid=f_m.fid'); $objects=$query->extend('PagerDefault')
->fields('c_f_u', array( 'fid','title'))
->fields('f_m', array( 'uri','filename','timestamp'))
// ->condition('f_m.status',1)
->orderBy('f_m.timestamp','DESC')
->limit(10)
-> execute() ; $output="";
$rows = array();
$title_length=25;
if (true) { foreach ($objects as $key => $object) {
// debug($object);
$row = array();
$title="";
if (strlen($object -> filename)>$title_length) {
$title= drupal_substr($object -> filename,0,50).'...' ;
}
else {
$title= $object -> filename ;
}
$url_head='http://'.$_SERVER['HTTP_HOST'].'/drupal755/sites/default/files/';
$url=$url_head.ltrim($object->uri,'public://');
$row['title']=l($object->title,$url);
$row['created']=date('Y-m-d h:m:s',$object->timestamp); $rows[] = $row;
}
$results=$rows;
$output .= theme('table', array('rows' => $rows));
$output .= theme('pager');
}
else
{
$output="暂无数据";
} return $output;
}

3.3 upload.admin.inc 文件

<?php
/*管理列表*/
function manage_upload_list()
{
$output = "";
$query = db_select('custom_file_upload','c_f_u');
$query->join('file_managed','f_m','c_f_u.fid=f_m.fid'); $objects = $query ->extend('PagerDefault')
->fields('f_m',array('fid','uri','filename'))
->fields('c_f_u',array('title'))
->orderBy('f_m.fid','DESC')
->limit(2)
-> execute(); $rows = array();
$title_length=25;
foreach ($objects as $key => $object) {
$row = array();
$title="";
if (strlen($object -> filename)>$title_length) {
$title= drupal_substr($object -> filename,0,50).'...' ;
}
else {
$title= $object -> filename ;
}
$url_head='http://'.$_SERVER['HTTP_HOST'].'/drupal755/sites/default/files/';
$url=$url_head.ltrim($object->uri,'public://');
$row['title']=l($object->title,$url);
$row[] = array('data' => l(t('删除'), 'admin/upload/'.$object->fid.'/delete'));
$rows[] = $row;
}
$output .= theme('table', array('rows' => $rows));
$output .= theme('pager'); return $output; } /**留言--删除页面
* Form constructor for the node deletion confirmation form.
*
* @see node_delete_confirm_submit()
*/
function upload_delete_confirm($form, &$form_state, $fid) {
$form['fid'] = array(
'#type' => 'hidden',
'#default_value'=>$fid
); $object=db_query('select title from {custom_file_upload} where fid= :fid ',array(':fid'=>$fid))
->fetch();
// Always provide entity id in the same form key as in the entity edit form.
return confirm_form($form,
t('Are you sure you want to delete %title?', array('%title' => $object->title)),
'/zjf',
t('This action cannot be undone.'),
t('Delete'),
t('Cancel')
);
} /**
* Executes node deletion.
*
* @see node_delete_confirm()
*/
function upload_delete_confirm_submit($form, &$form_state) {
if ($form_state['values']['confirm']) {
$fid=$form_state['values']['fid'];
$file = file_load($fid);
file_delete($file, TRUE); $num_deleted = db_delete('custom_file_upload')
->condition('fid', $fid)
->execute(); cache_clear_all();
//watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => $node->title));
drupal_set_message(t('删除成功'));
} $form_state['redirect'] ='admin/upload' ;// '<front>'
}