[2009/04/16]发布《Drupal项目实战-公司订餐系统(四)》本博客内容均为原创(Original),如有雷同,纯属巧合。转载请注明出处。同时欢迎学术探讨与批评。

2009年2月21日星期六

使用Drupal 6 Form API上传文件

在Drupal 6中,上传文件的函数与Drupal 5中的File Interface是有不同的。在Drupal 5中,上传文件使用的是file_check_upload函数;而在Drupal 6中,这个函数被取消了,换成了file_save_upload函数。
file_save_upload($source, $validators = array(), $dest = FALSE, $replace = FILE_EXISTS_RENAME)下面对每个参数作简要说明:

$source:自定义表单中,上传组件的名称。我在开发时,在这个参数上花费了不少时间,下面是手册中的解释:
$source A string specifying the name of the upload field to save.
我开始一直把upload field看成了upload file,以为这个函数传递的是文件名,因此始终不能上传成功。最后去include/file.inc的源文件中读源码,才发现了这个问题。因此提醒大家,不要误以为传递的应是文件名。

$validators: 用于检查上传文件的回调函数数组,元素就是函数名。这样使用:array('validate_upload' => $arg),其中$arg是你要传递给自定义检查函数的参数。
$dest: 上传文件的最终存放地址。Drupal有一个file_directory_path函数,用于返回当前Drupal的文件目录,如sites/default/files。
$replace: 指明如果上传的文件与现有文件重名,是否进行覆盖。如果不覆盖,则由Drupal自动重命名为filename_0, filename_1这样的文件。

下面给一个具体的示例,这是在drupal.org 找到的一些代码,然后我自己测试通过了。在使用之前,需确保files目录可写。
function my_form()
{
$form['upload'] = array(
'#type' => 'file',
'#title' => t('Upload your file:'),
'#size' => 40,
);
$form['#attributes'] = array('enctype' => "multipart/form-data");
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}

function my_form_submit($form, &$form_state)
{
$dest = file_directory_path();

if($file = file_save_upload('upload', array(), $dest))
{
$a = t('The attached file was successfully uploaded');
drupal_set_message($a);
}
else
{
drupal_set_message(t('The attched file failed to upload. Please try again'));
}
return;
}

没有评论:

发表评论