2012-01-16 2 views
2

Я хватаю файл с помощью CURL и хочу его локально сохранить, но он подключается к файловой системе Drupal. Должен ли я сделать ручную вставку или есть лучший способ? Самое близкое, что я мог найти:Программно вставить файл в файловую систему Drupal?

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

Но я не знаю, как это использовать. Любые лучшие предложения?

ответ

2

Есть несколько способов, но самый простой будет использовать file_save_upload():

$source = '/path/to/file.ext'; 
$dest = 'public://uploads/'; // Or whatever 
$file = file_save_upload($source, array(), $dest, FILE_EXISTS_RENAME); 

if ($file) { 
    // file_save_upload marks the file as temporary, we need to mark as permanent or it will be cleared from the database in a few hours 
    $file->status = FILE_STATUS_PERMANENT; 
    file_save($file); 
} 
+0

Спасибо, кстати. Ваш ответ привел меня в нужное место, чтобы положить конец моему ужасу. В следующий раз, когда я буду получать бесполезные ошибки, я просто перейду прямо к источнику функции drupal, чтобы узнать, почему. –

1

Это как раз о отвез меня из моего ума и пытается выяснить, простой способ обойти ожидания формы API Я столкнулся с этим вопросом. Ответ Клайва был началом того, как я это понял, потому что похоже, что вы можете предоставить источник как первый arg для file_save_upload(), но, как оказалось, вы не можете. По крайней мере, не в текущем drupal 7.30.

Я проверил связанную им связь и деконструировал функцию. В принципе, даже если вы передаете полный путь к исходному файлу, он по-прежнему ищет первый аргумент в массиве $ _FILES по пути. Кто знает, почему, но какая глупая идея. Таким образом, я сделал это:

//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? 
    }  
    } 
} 

Это создает узел определенного типа. В этом случае user_files, затем, если файл загружен, добавьте файл в таблицу мультимедиа, таблицу файлов или что-то еще, что она вызвала. Затем добавляет связь к вновь созданному узлу.

Это уродливое? Да. Почему я не использовал внутренний API формы drupal? Заткнись, вот почему. У нас не всегда есть выбор, поэтому, когда клиент запрашивает основную форму, которая просто отправляет их по электронной почте, быстро и легко сделать простое поле, которое отправляется через API-интерфейс шимпанзе или что-то в этом роде. Затем они добавляют, что им нужны файлы. Затем они хотят, чтобы он добавился к заднему концу drupal, и внезапно у вас появился снежок ужаса, который был бы намного проще, если бы это было сделано с API-интерфейсом формы для начала. Я не знаю, кто это начал, но мне пришлось закончить его, и я сделал это с этим ужасным взломом. Надеюсь, это поможет вам или тому, кто еще в настоящее время вращается в дропальном вихре ужаса.

0

Я был в состоянии сделать следующее, чтобы добавить файл из папки Drupal (обычно sites/default/files или sites/DOMAIN/files) public:// использованием file_save.

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

Это добавляет соответствующую запись в основной file_managed таблицы Drupal. Если у вас установлен модуль File Entity, там также создается запись.

Возвращенный объект будет содержать идентификатор базы данных как $file->fid.

Смежные вопросы