关键点有两个: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. Servlet的Request.getInputStream()只能读取一次问题

    Servlet的Request.getInputStream()只能读取一次问题 这个星期公司的项目接口进行改造,公司的接口有的采用了WebService的方式,有的使用的是Http协议+Servle ...

  2. hdu 1671 Phone List(字典树)

    知道bug的时候我眼泪掉下来... 我的第一道字典树,看了字典树的注意事项和实现方式,我写这道题的时候格外认真,就是奔着1A去的.结果这是几A来着? 第一遍写的时候提交MLA,我看了一下,是因为我释放 ...

  3. 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml

    一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...

  4. vs2012中程序集生成无法自动在网站Bin目录下生成Dll文件?(已解决!)

    最近,突然发现生成程序集后,网站bin目录下dll没有更新,也没有自动生成dll文件,通过近半个小时的摸索和实验,找到了解决方法: 1.右键网站,不是项目,选择[属性页],在左侧[引用]中如果没有,就 ...

  5. ClassLoader的等级加载机制

    摘自深入分析java web技术内幕

  6. 理解Javascript的状态容器Redux

    Redux要解决什么问题? 随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state (状态). 这些 state 可能包括服务器响应.缓存数据. ...

  7. 结构-行为-样式-Js排序算法之 快速排序

    快速排序算法,是我的算法系列博客中的第二个Js实现的算法,主要思路:    在一个数组中随机取一个数(一般都取第一个或者最后一个),使这个数与数组中其他数进行比较,如果比它大就放到它的右边,比它小就放 ...

  8. js面向对象小结(工厂模式,构造函数,原型方法,继承)

    最近过了一遍尼古拉斯泽卡斯的高级程序设计第三版(红皮书)第六章:面向对象程序设计,现在把总结出来的东西和大家分享一下. 主要内容如下: 1.工厂模式 2.构造函数模式 3.原型模式 4.继承 一.工厂 ...

  9. 关于Ueditor 前后端分离实现文件上传到独立服务器的问题 望大神们赐教

    最近,由于网站实现多台服务器负载均衡,导致编辑器上传文件需要同步,可是使用同步软件太慢,不太现实,所以想到实现编辑器上传文件直接上传到独立文件服务器.可是没想到遇到坑了. 1.在本地IIS 中添加网站 ...

  10. Windows离开模式(AwayMode)

    Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Man ...