Вы здесь

Архивация файла при загрузке

0

Как правильно заменить загружаемый файл, на тот что заархивирован.

Пример такой:
1. Пользователь при создании ноды загружает файл.txt.
2. Нужно архивировать файл (напишу сам) и в форме использовать архивированный файл.

Как правильно заменить оригинальный файл?

Версия Drupal: 
7.x
Категория: 
File API
Вопрос задан 15.11.2015 - 20:22

Ответы

0

Архив выбрал '.gz', так как мне нужно упаковывать только один файл он мне подходит и сжимает достаточно нормально. Написал рабочее решение в модуле:

/**
 * 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(preg_replace(array("/\s/", "/[^a-zA-ZА-Яа-я0-9-]/u"), array("-", ""), 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);
    }
}

upd.
Добавил обработку спец. символов в названии файла.

Ответ дан 19.12.2015 - 15:29