关键点有两个: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:实现上传的具体代码:
1 function uploadview_form_submit($form, &$form_state){ 2 // Load the file via file.fid. 3 $file = file_load($form_state['values']['my_file_field']); 4 $file->status = FILE_STATUS_PERMANENT; 5 file_save($file); 6 7 drupal_set_message('保存成功'); 9 }
需要特别说明一下的是,第4行代码,就是为文件制定了satus=1,即永久保存的文件,不会被drupal自动删除;否则是status=0,指的是临时文件,会被drupal定期自动删除。
三、完全意义上的实现
到前面两步,我们已经实现了上传的功能,但是怎么查看上传的文件列表,从而进行下载和管理呢?就是你怎么从数据库中查出你做额这个页面的上传的文件呢?
这里我们需要了解,凡是上传的文件都会在file_manage表中保存一条记录,上面说到的status就是该表的属性之一,下面就是一条该表的记录:
但是其他模块上传的文件也会在这张表中留下痕迹,怎么区分呢?目前我能给出的方案就是,单独再建立一张表,两张表进行关联,表结构为: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', ), ); }