Permitir la carga de archivos CSV en WordPress

27 feb 2017, 23:34:10
Vistas: 18.8K
Votos: 5

Estoy intentando permitir archivos CSV en una página del menú del dashboard de esta forma...

<form method="post" enctype="multipart/form-data">
    <input type="file" name="csv_file" id="csv_file"  multiple="false" accept=".csv" />
    <input type="submit" value="Subir archivo" />
</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',
    ),
) );

Cuando subo un archivo CSV al formulario obtengo el siguiente mensaje de error...

Lo sentimos, este tipo de archivo no está permitido por razones de seguridad.

¿Alguien puede ver qué estoy haciendo mal? Había asumido que había permitido el tipo mime CSV en el código anterior.

0
Todas las respuestas a la pregunta 3
1

Existe un error en WordPress 4.7-4.7.3 relacionado con la validación de tipos MIME, por lo que el código proporcionado por Dave Romsey no funcionará.

Hay un plugin en el repositorio que evita las comprobaciones MIME, pero desactiva las verificaciones para todos los usuarios y todas las extensiones. Creo que una mejor solución sería agregar una nueva capacidad para los administradores que les permita subir archivos con extensión .csv.

//* Registrar hooks de activación y desactivación
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );

//* Añadir capacidad upload_csv al rol de administrador
function wpse_258192_activation() {
  $admin = get_role( 'administrator' );
  $admin->add_cap( 'upload_csv' );
}

//* Eliminar capacidad upload_csv del rol de administrador
function wpse_258192_deactivation() {
  $admin = get_role( 'administrator' );
  $admin->remove_cap( 'upload_csv' );
}

//* Añadir filtro para verificar tipo de archivo y extensión
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );

//* Si el usuario actual puede upload_csv y la extensión del archivo es csv, sobrescribir argumentos - edición - "$pathinfo" cambiado a "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 feb 2017 01:37:57
Comentarios

No estoy seguro si este código es antiguo o no, pero ya no funciona.

David Rhoderick David Rhoderick
6 ago 2020 16:19:28
1

Si deseas una solución temporal rápida y sencilla, puedes permitir subidas sin filtrar en tu archivo wp-config.php.

define('ALLOW_UNFILTERED_UPLOADS', true);

Esta línea probablemente no debería permanecer en tu config.php, pero si necesitas hacer algo como una importación única de productos de WooCommerce mediante CSV, puede ser una solución fácil.

25 feb 2020 13:52:53
Comentarios

Como solución rápida (y luego eliminándolo de wp-config.php inmediatamente después) esto funcionó para mí.

Nathan Nathan
31 ago 2020 21:11:49
2

Por defecto, WordPress bloquea la subida de archivos .csv. El filtro mime_types te permitirá añadir archivos .csv o cualquier otro archivo para que puedan ser subidos:

add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
    // Añade csv a la lista de tipos mime permitidos
    $existing_mimes['csv'] = 'text/csv';

    return $existing_mimes;
}
28 feb 2017 00:09:13
Comentarios

Entonces, siendo ese el caso, ¿para qué se utiliza la anulación de mime de media_handle_upload?

fightstarr20 fightstarr20
28 feb 2017 00:59:04

En realidad, el array $mimes dentro del array $overrides cumple el mismo propósito después de todo. Así que el problema podría originarse del error señalado por Nathan Johnson en su respuesta. (Tenía habilitado algún código en mi entorno de pruebas que anulaba la verificación de mime debido al error, lo cual había olvidado :)

Dave Romsey Dave Romsey
28 feb 2017 01:53:40