web-dev-qa-db-fra.com

Autoriser le téléchargement de fichiers CSV

J'essaie d'autoriser les fichiers CSV dans une page de menu de tableau de bord comme celle-ci.

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

Lorsque je télécharge un fichier CSV sur le formulaire, le message d'erreur suivant s'affiche:.

Sorry, this file type is not permitted for security reasons.

Quelqu'un peut-il repérer ce que je fais mal? J'avais supposé que j'avais autorisé le type mime CSV dans le code ci-dessus.

4
fightstarr20

Il y a un bug dans WordPress 4.7-4.7.3 lié à la validation des types MIME, donc le code fourni par Dave Romsey ne fonctionnera pas.

Il y a un plugin dans le référentiel qui contournera les vérifications MIME, mais il désactive les vérifications pour tous les utilisateurs et toutes les extensions. Je pense qu'un meilleur moyen serait d'ajouter une nouvelle fonctionnalité pour les administrateurs, qui leur permettra de télécharger des extensions .csv.

//* Register activation and deactivation hooks
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );

//* Add upload_csv capability to administrator role
function wpse_258192_activation() {
  $admin = get_role( 'administrator' );
  $admin->add_cap( 'upload_csv' );
}

//* Remove upload_csv capability from administrator role
function wpse_258192_deactivation() {
  $admin = get_role( 'administrator' );
  $admin->remove_cap( 'upload_csv' );
}

//* Add filter to check filetype and extension
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );

//* If the current user can upload_csv and the file extension is csv, override arguments - edit - "$pathinfo" changed to "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;
}
5
Nathan Johnson

Par défaut, WordPress bloque les envois de fichiers .csv. Le filtre mime_types vous permettra d'ajouter des fichiers .csv ou tout autre fichier à télécharger:

add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
    // Add csv to the list of allowed mime types
    $existing_mimes['csv'] = 'text/csv';

    return $existing_mimes;
}
3
Dave Romsey