以编程方式在Drupal';s文件系统?

以编程方式在Drupal';s文件系统?,drupal,drupal-7,Drupal,Drupal 7,我使用CURL获取一个文件,并希望将其保存在本地,但它插入到Drupal的文件系统中。我需要手动插入还是有更好的方法?我能找到的最接近的是: function image_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items); 但我不知道怎么用这个。有更好的建议吗?有几种方法,但最简单的方法是使用: 这几乎把我逼疯了,在试图找到一种简单的方法来规避表单API期望时,我遇到了这个问题。克莱夫的

我使用CURL获取一个文件,并希望将其保存在本地,但它插入到Drupal的文件系统中。我需要手动插入还是有更好的方法?我能找到的最接近的是:

function image_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items);

但我不知道怎么用这个。有更好的建议吗?

有几种方法,但最简单的方法是使用:


这几乎把我逼疯了,在试图找到一种简单的方法来规避表单API期望时,我遇到了这个问题。克莱夫的回答是我如何理解它的开始,因为看起来你可以提供一个源代码作为file_save_upload()的第一个参数,但事实证明,你不能。至少在当前的drupal 7.30中没有

我检查了他提供的链接并解构了这个函数。基本上,即使传递完整的源路径,它仍然会沿着路径查找$\u文件数组中的第一个参数。谁知道为什么,但这是一个多么愚蠢的想法。所以我这样做了:

//after verifying all post fields are set...
$node = new stdClass();
$node->type = 'user_files';
node_object_prepare($node);

$node->title    = $_POST['title'];
$node->author = 2; //hardcoded because only admin uses this form
$node->uid = 2;
$node->language = LANGUAGE_NONE;
$node->body[$node->language][0]['value']   = $_POST['body'];
$node->body[$node->language][0]['summary'] = text_summary($_POST['body']);
$node->body[$node->language][0]['format']  = 'filtered_html';

$node->field_first_name[$node->language][0]['value'] = $_POST['first_name'];
$node->field_last_name[$node->language][0]['value'] = $_POST['last_name'];

node_save($node);

if(isset($_FILES['file']['tmp_name']) && $_FILES['file']['name'] != '')
{
  //upload file

  $file = new stdClass();
  $file->uid = 2;
  $file->status = 0;
  $file->filename = trim(drupal_basename($_FILES['file']['name']), '.');
  $file->uri = $_FILES['file']['name'];
  $file->filemime = file_get_mimetype($file->filename);
  $file->filesize = $_FILES['file']['size'];
  $file->filename = file_munge_filename($file->filename, 'jpg jpeg gif png doc docx pdf');
  $file->destination = file_destination('private://' . $file->filename, FILE_EXISTS_RENAME);
  $file->uri = $file->destination;
  if (!drupal_move_uploaded_file($_FILES['file']['tmp_name'], $file->uri)) {

    return false; //set errors or do whatever you want on error
  }
  else
  {
    drupal_chmod($file->uri);
    $existing_files = file_load_multiple(array(), array('uri' => $file->uri));
    if (count($existing_files)) {
      $existing = reset($existing_files);
      $file->fid = $existing->fid;
    } 

    if ($file = file_save($file)) {
      // Add file to the cache.

      $node->field_file[$node->language][0]['uri'] = 'private://'.$file->filename;
      $node->field_file[$node->language][0]['fid'] = $file->fid;
      $node->field_file[$node->language][0]['display'] = 1;
      $node->field_file[$node->language][0]['description'] = 'User uploaded file';
      node_save($node);

      //do we notify someone?
    }    
  }
}
这将创建指定类型的节点。在这种情况下,如果上传了一个文件,请将该文件添加到媒体表、文件表或其他名称中。然后将关联添加到新创建的节点


它难看吗?是 啊为什么我没有使用内部drupal表单API?闭嘴,这就是为什么。我们并不总是有选择的余地,所以当一个客户要求一个只发送电子邮件的基本表单时,创建一个通过mail chimp API或其他方式发送的简单字段是非常简单的。然后,他们添加了他们想要的文件。后来,他们想把它添加到drupal后端,突然之间,你就有了一个雪球般的恐惧感,如果从表单API开始的话,这会容易得多。我不知道是谁开始的,但我不得不结束它,我用这个可怕的黑客做到了。希望它能帮助你或其他正在drupal恐怖漩涡中旋转的人。

我可以通过以下操作从
公共文件夹添加一个文件://
drupal文件夹(通常是
站点/default/files
站点/DOMAIN/files

这会将适当的条目添加到Drupal core
文件\u managed
表中。如果您安装了模块,也会在其中创建一个条目


顺便说一下,返回的文件对象将包括数据库ID,如
$file->fid

谢谢。你的回答把我带到正确的地方结束我的恐惧。下一次当我不断地得到无用的错误时,我将直接查看drupal函数的源代码来找出原因。
//after verifying all post fields are set...
$node = new stdClass();
$node->type = 'user_files';
node_object_prepare($node);

$node->title    = $_POST['title'];
$node->author = 2; //hardcoded because only admin uses this form
$node->uid = 2;
$node->language = LANGUAGE_NONE;
$node->body[$node->language][0]['value']   = $_POST['body'];
$node->body[$node->language][0]['summary'] = text_summary($_POST['body']);
$node->body[$node->language][0]['format']  = 'filtered_html';

$node->field_first_name[$node->language][0]['value'] = $_POST['first_name'];
$node->field_last_name[$node->language][0]['value'] = $_POST['last_name'];

node_save($node);

if(isset($_FILES['file']['tmp_name']) && $_FILES['file']['name'] != '')
{
  //upload file

  $file = new stdClass();
  $file->uid = 2;
  $file->status = 0;
  $file->filename = trim(drupal_basename($_FILES['file']['name']), '.');
  $file->uri = $_FILES['file']['name'];
  $file->filemime = file_get_mimetype($file->filename);
  $file->filesize = $_FILES['file']['size'];
  $file->filename = file_munge_filename($file->filename, 'jpg jpeg gif png doc docx pdf');
  $file->destination = file_destination('private://' . $file->filename, FILE_EXISTS_RENAME);
  $file->uri = $file->destination;
  if (!drupal_move_uploaded_file($_FILES['file']['tmp_name'], $file->uri)) {

    return false; //set errors or do whatever you want on error
  }
  else
  {
    drupal_chmod($file->uri);
    $existing_files = file_load_multiple(array(), array('uri' => $file->uri));
    if (count($existing_files)) {
      $existing = reset($existing_files);
      $file->fid = $existing->fid;
    } 

    if ($file = file_save($file)) {
      // Add file to the cache.

      $node->field_file[$node->language][0]['uri'] = 'private://'.$file->filename;
      $node->field_file[$node->language][0]['fid'] = $file->fid;
      $node->field_file[$node->language][0]['display'] = 1;
      $node->field_file[$node->language][0]['description'] = 'User uploaded file';
      node_save($node);

      //do we notify someone?
    }    
  }
}
$uri = 'public://filename.pdf';
$file = file_save((object) array(
  'filename' => basename($uri),
  'uri' => $uri,
  'status' => FILE_STATUS_PERMANENT,
  'filemime' => file_get_mimetype($uri),
));