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:实现上传的具体代码:
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 开发自定义上传、下载模块的上传功能的更多相关文章
- [原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- jsp上传下载+SmartUpload插件上传
使用之前须要自己下载jspSmartUpload.jar包 这里找到一个支持中文的jar包,下载地址例如以下: http://www.blogjava.net/Files/hijackwust/jsm ...
- python使用ftplib模块实现FTP文件的上传下载
python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...
- SpringMVC文件上传下载(单文件、多文件)
前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- JavaWeb 文件上传下载
1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...
- 转载:JavaWeb 文件上传下载
转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- Struts2配合layui多文件上传--下载
先说上传: 前台上传文件的js代码: var demoListView = $('#demoList') ,uploadListIns = upload.render({ elem: '#testLi ...
随机推荐
- 关于code reivew
关于code reivew 先谈谈三个code review的关键因素: 一.创建review要简单 code reivew是一个程序员日常工作中经常做的一件事,理论上来讲,任何一个将要submit到 ...
- 用Arduino做一个可视化网络威胁级别指示器!
在当今世界,网络监控器是非常重要的.互联网是个可怕的地方.人们已经采取措施以提高警戒----他们安装了入侵检测系统(IDS)比如SNORT. 通过把可视化部分从电脑中移出来,我们想让它更容易去观察.一 ...
- 计算机就是用命换的行业,多干一年程序猿,寿命将减少2年,干20年的编程苦力,基本60岁之前你就要OVER了
if c++==python:(869710179) 2013-7-6 10:21:31 计算机本来就是用命换的行业 爱笑的眼睛(373213735) 2013-7-6 10:21:55 if c ...
- Android中系统设置中的清除数据究竟会清除哪些数据
今天中的一个story突然提到了系统设置中的清理数据,后来开始思考究竟系统的应用的这个清理功能,究竟会清理那些数据. 于是开始研究,以com.mx.browser为例,思路大概为首先为/data/da ...
- java foreach实现原理
在平时Java程序中,应用比较多的就是对Collection集合类的foreach遍历,foreach之所以能工作,是因为这些集合类都实现了Iterable接口,该接口中定义了Iterator迭代器的 ...
- 两行代码实现微信小程序联系人sidebar
话不多说,先给你们看看核心数据和结构: 一.数据: city的json array,letter的array (city的json array里的首字母是我手工放置进去的,你也可以通过for循环获得c ...
- gRPC helloworld service, RESTful JSON API gateway and swagger UI
概述 本篇博文完整讲述了如果通过 protocol buffers 定义并启动一个 gRPC 服务,然后在 gRPC 服务上提供一个 RESTful JSON API 的反向代理 gateway,最后 ...
- php目录函数
1.创建 mkdir()mkdir(目录地址,权限模式,是否递归创建)默认不支持递归创建,用第三个参数true表示递归创建 <?php header("content-type:tex ...
- [CSS] 子元素垂直居中的两种方式
1. 多个子元素水平并排,IE10以下失效 display: flex; align-items: center; justify-content: center; 2.多个子元素竖直排列,这种方式会 ...
- 利用fiddler将本地网页放到某个域下
注: 1)在学习慕课网课程<搜索框制作>中遇到如题困难,查找资料后解决,做此记录.课程网址http://www.imooc.com/video/263. 2)建议同时去学习慕课网课程< ...