У меня стояла задача сжимать файл (xml) при загрузке, ибо при большом количестве ощутимо места занимает. Плюс я еще проверяю на валидность xml загружаемого файла, если же вам не нужна проверка, то можете немного переделать код и все.
Возможно кому-то нужен такой функционал:
<?php
/**
* Implementation of hook_file_presave()
*/
function xml_import_file_presave($file) {
$path = pathinfo($file->uri);
if ($file->status == 0 && $path['extension'] == 'xml' && $file->source == 'field_xml_file_und_0') { //field_xml_file - машинное имя поля
try {
$full_path = drupal_realpath($file->uri);
libxml_use_internal_errors(true);
$xml = new SimpleXMLElement("compress.zlib://$full_path", NULL, TRUE);
global
$base_url;
$domain = str_replace('http://', '-', $base_url);
$title = (array) $xml->description->{'name'}; //получаем название из xml файла
$title_lower = transliteration_get(str_replace(' ', '-', mb_strtolower($title[0])) . $domain, '');
$file_name = $title_lower . '.xml';
$dir_file = file_create_filename($file_name, drupal_dirname($file->uri));
$new_link = $dir_file . '.gz'; //path to file in archive
//dpm($dir_file);
rename($file->uri, $dir_file);
$file->filename = $file_name;
$file->origname = $file_name;
$file->uri = $dir_file;
$data = implode('', file($file->uri));
$gzdata = gzencode($data, 9);
$fp = fopen($new_link, 'w');
fwrite($fp, $gzdata);
fclose($fp);
file_unmanaged_delete($file->uri); // delete old file from "public://"
//Replace all data
$file_name .= '.gz';
$file->filename = $file_name;
$file->origname = $file_name;
$file->uri = $new_link;
$file->destination = $new_link;
$file->filesize = filesize($new_link);
$file->filemime = 'application/x-gzip';
$file->type = 'archive';
} catch (Exception $ex) {
//Display message when error loading xml-file
libxml_clear_errors();
drupal_set_message(t('Expected data in a XML-format.'), 'error');
}
//dpm($file);
}
}
?>
Комментарии
Спасибо @Maximus_fonar может пригодится.
Пожалуйста![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Не могу изменить запись из-за того что "Не используйте матерные или агрессивные слова", хотя какие агрессивные у меня слова в коде я не знаю.
Поскольку код я не могу закинуть, напишу так. Используйте в $title_lower preg_replace(), вместо str_replace() для того что б не брать в название всякие спец. символы.