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

关键点有两个: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;100%">'.l('更多>>',$url).'</div>';
    }
     
    return  $output;
}

function upload_theme(){
    return array(
        'hoyand_paiko_thumb_upload' => array(
            'render element' => 'element',
        ),
    );
}

 
View Code

    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;
}
View Code

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>'
}
View Code

 

 

 

原文地址:https://www.cnblogs.com/zjfblog/p/6206643.html