Разрешить загрузку CSV файлов

27 февр. 2017 г., 23:34:10
Просмотры: 18.8K
Голосов: 5

Я пытаюсь разрешить загрузку CSV файлов на странице админ-панели следующим образом...

<form method="post" enctype="multipart/form-data">
    <input type="file" name="csv_file" id="csv_file"  multiple="false" accept=".csv" />
    <input type="submit" value="Загрузить" />
</form>


require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );

$attachment_id = media_handle_upload ( 'csv_file', 0, array(), array(
    'test_form' => false,
    'mimes'     => array(
        'csv'   => 'text/csv', // Указываем разрешенный MIME тип для CSV
    ),
) );

При попытке загрузить CSV файл через эту форму я получаю следующую ошибку...

Извините, этот тип файла не разрешен по соображениям безопасности.

Кто-нибудь может подсказать, что я делаю не так? Я предполагал, что разрешил MIME тип для CSV в приведенном выше коде.

0
Все ответы на вопрос 3
1

В WordPress 4.7-4.7.3 существует баг, связанный с проверкой MIME-типов, поэтому код, предоставленный Dave Romsey, не будет работать.

Существует плагин в репозитории, который обходит проверку MIME-типов, но он отключает проверки для всех пользователей и всех расширений. Я считаю, что лучшим решением будет добавить новую возможность (capability) для администраторов, позволяющую им загружать файлы с расширением .csv.

//* Регистрация хуков активации и деактивации
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );

//* Добавление возможности upload_csv для роли администратора
function wpse_258192_activation() {
  $admin = get_role( 'administrator' );
  $admin->add_cap( 'upload_csv' );
}

//* Удаление возможности upload_csv у роли администратора
function wpse_258192_deactivation() {
  $admin = get_role( 'administrator' );
  $admin->remove_cap( 'upload_csv' );
}

//* Добавление фильтра для проверки типа файла и расширения
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );

//* Если текущий пользователь имеет право upload_csv и расширение файла csv, переопределяем аргументы - примечание: "$pathinfo" изменено на "pathinfo"
function wpse_258192_check_filetype_and_ext( $args, $file, $filename, $mimes ) {
  if( current_user_can( 'upload_csv' ) && 'csv' === pathinfo( $filename )[ 'extension' ] ){
    $args = array(
      'ext'             => 'csv',
      'type'            => 'text/csv',
      'proper_filename' => $filename,
    );
  }
  return $args;
}
28 февр. 2017 г. 01:37:57
Комментарии

Не уверен, актуален ли этот код, но он больше не работает.

David Rhoderick David Rhoderick
6 авг. 2020 г. 16:19:28
1

Если вам нужно временное быстрое и простое решение, вы можете разрешить незащищенные загрузки в вашем файле wp-config.php.

define('ALLOW_UNFILTERED_UPLOADS', true);

Эту строку, вероятно, не стоит оставлять в вашем config.php на постоянной основе, но если вам нужно выполнить что-то вроде импорта товаров WooCommerce через CSV всего один раз, это может быть простым решением.

25 февр. 2020 г. 13:52:53
Комментарии

Как быстрое решение (и последующее удаление из wp-config.php сразу после) это сработало для меня.

Nathan Nathan
31 авг. 2020 г. 21:11:49
2

По умолчанию WordPress блокирует загрузку файлов с расширением .csv. Фильтр mime_types позволит вам разрешить загрузку .csv файлов или любых других типов файлов:

add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
    // Добавляем csv в список разрешенных MIME-типов
    $existing_mimes['csv'] = 'text/csv';

    return $existing_mimes;
}
28 февр. 2017 г. 00:09:13
Комментарии

Итак, учитывая это, для чего предназначено переопределение mime в media_handle_upload?

fightstarr20 fightstarr20
28 февр. 2017 г. 00:59:04

На самом деле, массив $mimes внутри массива $overrides действительно служит той же цели. Так что проблема может быть связана с ошибкой, отмеченной Натаном Джонсоном в его ответе. (У меня в тестовой среде был включен код, который переопределял проверку mime из-за этой ошибки, о чем я забыл :)

Dave Romsey Dave Romsey
28 февр. 2017 г. 01:53:40