Permettere il caricamento di file CSV

27 feb 2017, 23:34:10
Visualizzazioni: 18.8K
Voti: 5

Sto cercando di permettere il caricamento di file CSV in una pagina del menu dashboard come questa...

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

Quando carico un file CSV nel form ottengo il seguente messaggio di errore...

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

Qualcuno riesce a vedere cosa sto sbagliando? Pensavo di aver già permesso il tipo MIME per i CSV nel codice sopra.

0
Tutte le risposte alla domanda 3
1

C'è un bug in WordPress 4.7-4.7.3 relativo alla validazione dei tipi MIME, quindi il codice fornito da Dave Romsey non funzionerà.

Esiste un plugin nel repository che bypassa i controlli MIME, ma disabilita i controlli per tutti gli utenti e tutte le estensioni. Penso che un modo migliore sarebbe aggiungere una nuova capability per gli amministratori che permetta loro di caricare file con estensione .csv.

//* Registra gli hook di attivazione e disattivazione
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );

//* Aggiunge la capability upload_csv al ruolo amministratore
function wpse_258192_activation() {
  $admin = get_role( 'administrator' );
  $admin->add_cap( 'upload_csv' );
}

//* Rimuove la capability upload_csv dal ruolo amministratore
function wpse_258192_deactivation() {
  $admin = get_role( 'administrator' );
  $admin->remove_cap( 'upload_csv' );
}

//* Aggiunge il filtro per verificare tipo di file e estensione
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );

//* Se l'utente corrente può upload_csv e l'estensione del file è csv, sovrascrive gli argomenti - modifica - "$pathinfo" cambiato in "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
Commenti

Non sono sicuro se questo codice sia vecchio o meno, ma non funziona più.

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

Se desideri una soluzione temporanea rapida e semplice, puoi consentire upload non filtrati nel tuo file wp-config.php.

define('ALLOW_UNFILTERED_UPLOADS', true);

Questa riga probabilmente non dovrebbe rimanere nel tuo config.php, ma se vuoi fare qualcosa come un'importazione di prodotti WooCommerce via CSV una sola volta, può essere una soluzione semplice.

25 feb 2020 13:52:53
Commenti

Come soluzione rapida (e poi rimuoverla da wp-config.php immediatamente dopo) questo ha funzionato per me.

Nathan Nathan
31 ago 2020 21:11:49
2

Di default, WordPress blocca il caricamento di file .csv. Il filtro mime_types ti permetterà di aggiungere i file .csv o qualsiasi altro file da caricare:

add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
    // Aggiunge csv alla lista dei mime type consentiti
    $existing_mimes['csv'] = 'text/csv';

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

Quindi, in questo caso, a cosa serve l'override del mime in media_handle_upload?

fightstarr20 fightstarr20
28 feb 2017 00:59:04

In realtà, l'array $mimes all'interno dell'array $overrides serve effettivamente allo stesso scopo. Quindi il problema potrebbe derivare dal bug segnalato da Nathan Johnson nella sua risposta. (Avevo del codice abilitato nel mio ambiente di test che bypassava il controllo del mime a causa del bug, cosa che avevo dimenticato :)

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