表格Api文件上传


9

我的表单中包含以下代码。

$form['new']['upload'] = array(
  '#type' => 'file',
  '#title' => t(''),
  '#size' => 40,
);

在提交处理程序上,它返回文件名,但不保存文件并返回文件对象。我还需要做什么?

我想做的是创建一个块,您可以在其中上传保存在节点的文件字段中的文件。

Answers:


8

看一下file_save_upload()和调用它的函数。

该函数将处理文件的验证,并将其保存到新位置。在Drupal 7中,这还将文件添加到file_managed表中。
请注意,该文件将作为临时文件存储,因此请确保此后将文件的状态设置为“永久”。

您可能要在表单的验证挂钩中(在提交处理程序之前)实现file_save_upload函数,以便可以在文件上传失败或不满足验证要求时提醒用户。

如果您要验证的图像字段的名称为image,则file_save_upload的第一个参数应为image,如下所示:

$ path = file_save_upload('image',...);

然后,此函数将返回图像上传到的服务器上的路径(例如,您可以将该路径存储在自定义数据库字段中)。


4

您在表单定义中缺少此功能:

   $form['#attributes']['enctype'] = 'multipart/form-data'; // If this is not here, upload will fail on submit

这是我用来在表单上创建文件上传小部件的逻辑:

   // these give us the file upload widget: 
   $form['#attributes']['enctype'] = 'multipart/form-data'; // If this is not here, upload will fail on submit
   $form['fid'] = array( '#title'        => t('Upload image'),
                         '#type'         => 'file',
                         '#description'  => t('Images must be one of jpg, bmp, gif or png formats.'),
                       ); 

这是与该逻辑相对应的,我在表单的validate回调中有此逻辑,因为我的逻辑中有图像文件名限制,但是如果需要,可以将其放在Submit回调中:

   // @see: http://api.drupal.org/api/function/file_save_upload/6
   // $file will become 0 if the upload doesn't exist, or an object describing the uploaded file
   $file = file_save_upload( 'fid' );
   error_log( 'file is "'.print_r( $file, true ).'"' );
   if (!$file) {
      form_set_error('fid', t('Unable to access file or file is missing.'));
   }

而已。


3
实际上,您$form['#attributes']['enctype']在Drupal 7中并不需要。它会自动处理
user724228 2011年

3
您不需要multipart/form-datadrupal 7,它是在使用文件字段时内置在drupal 7中的。
FLY 2012年

@bsenftner我使用的方法与您相同,但是当我尝试时,我发现$file === null,这意味着no file was uploaded(根据规格:api.drupal.org/api/drupal/includes!file.inc/function /…)在那种情况下我该怎么办?我该如何调试这种事情?
肖恩2012年

@Shawn:您在Drupal 7中工作吗?此逻辑已针对Drupal 6进行了测试。我还没有机会在D7上进行尝试,因此,如果您在D7中,则“我不知道”。如果您在D6中,那么它应该可以正常工作-您确定“ fid”是文件上传小部件的字段名称吗?
布莱克·森夫特纳

这两个问题都是肯定的:我确定我为小部件使用了正确的名称,并且我正在使用D7。我想我应该提出一个新问题……
肖恩

3

我有一个通用的验证功能,主要用于需要支持图片上传的主题中。您也许可以按原样使用它,也可以稍作更改,但是这样做应该可以帮助您。

/**
 * Validate/submit handler used for handling image uploads
 */
function module_upload_image_validate($form, &$form_state) {
  // This is not needed, I use this to use the same validate function
  // for several fields.
  $key = $form['#key'];
  $file = file_save_upload($key, array(
    'file_validate_is_image' => array(),
    'file_validate_extensions' => array('png gif jpg jpeg'),
  ));
  if ($file) {
    // Get the image info to get the correct extension for the uploaded file.
    $info = image_get_info($file->filepath);
    if (file_move($file, 'destination/filename'. $info['extension'], FILE_EXISTS_REPLACE)) {
      // Mark the file for permanent storage.
      file_set_status($file, FILE_STATUS_PERMANENT);
      // Update the files table.
      drupal_write_record('files', $file, 'fid');
      $form_state['values'][$key] = $file->filepath;
    }
    else {
      form_set_error($key, t('Failed to write the uploaded file to the site’s files folder.'));
    }
  }
}

使用此功能,您将获得文件路径作为表单提交处理程序中的值。您可能需要文件ID,具体取决于您的使用情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.