关键点有两个: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就是该表的属性之一,下面就是一条该表的记录:

但是其他模块上传的文件也会在这张表中留下痕迹,怎么区分呢?目前我能给出的方案就是,单独再建立一张表,两张表进行关联,表结构为: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>'
}

drupal7 开发自定义上传、下载模块的上传功能的更多相关文章

  1. [原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. jsp上传下载+SmartUpload插件上传

    使用之前须要自己下载jspSmartUpload.jar包 这里找到一个支持中文的jar包,下载地址例如以下: http://www.blogjava.net/Files/hijackwust/jsm ...

  3. python使用ftplib模块实现FTP文件的上传下载

    python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...

  4. SpringMVC文件上传下载(单文件、多文件)

    前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...

  5. Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...

  6. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  7. 转载:JavaWeb 文件上传下载

    转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...

  8. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  9. Struts2配合layui多文件上传--下载

    先说上传: 前台上传文件的js代码: var demoListView = $('#demoList') ,uploadListIns = upload.render({ elem: '#testLi ...

随机推荐

  1. MongoDB深圳用户组线下活动召集

    MongoDB线下用户组是由全世界MongoDB爱好者发起的不定期线下交流活动.目前全球有100多个MongoDB用户组,3万5千多爱好者参与.用户组活动的形式通常会有一到两个MongoDB相关的技术 ...

  2. PHP, Python Nginx works together!

    Nginx is so good at delivering requests to many others. Good! Now let's use the nginx upstream modul ...

  3. Javascript 闭包与变量

    1.闭包与变量 JavaScript中的作用域链的机制引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值.闭包所保存的是整个变量对象,而不是某个特殊的值. 1 2 3 4 5 6 7 8 ...

  4. CALayer之mask属性-遮罩

    CALayer有一个属性叫做mask. 这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性. 它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图 ...

  5. 简介alert()与console.log()的不同

    简单的说alert 是弹出提示而console.log是在调试工具里打日志,下面具体给大家列出alert()与console.log()的不同点, [1]alert() [1.1]有阻塞作用,不点击确 ...

  6. oracle ebs 分类账与法人主体对应关系

    --ebs 分类账与法人主体对应关系 SELECT A.SET_OF_BOOKS_ID LEDGER_ID, GL.NAME LEDGER_NAME, GL.CURRENCY_CODE, FFV.FL ...

  7. GridView Tab/Enter键插入新行

    此段代码是从DevExpress官方回复文件中得到的.可以用来优化GridView的操作体验. /// <summary> /// GridView添加新行 /// </summar ...

  8. IOS CALayer是什么

    大家在开发IOS程序时,经常会遇到self.view.layer这个东西,我以前也是不求甚解,后来觉得有必要整理下. 简单介绍layer: 在IOS中,你能看得见摸得着的东西都是UIView,比如一个 ...

  9. ubuntu 下 编译ffmpeg 3.1.1

    1,下载ggmpeg源码:http://ffmpeg.org/download.html 2.下载ndk ,百度 3.配置环境 3.1 编译FFMPEG时,出现了 ffmpeg yasm not fo ...

  10. SELinux开启和关闭

    1.查看SELinux状态 /usr/sbin/sestatus -v 2.关闭SELinux (1)临时关闭(不用重启机器): setenforce 0 #设置SELinux成为permissive ...