Permite încărcarea fișierelor CSV

27 feb. 2017, 23:34:10
Vizualizări: 18.8K
Voturi: 5

Încerc să permit încărcarea fișierelor CSV într-o pagină de meniu din dashboard astfel...

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

Când încarc un fișier CSV în formular, primesc următoarea eroare...

Ne pare rău, acest tip de fișier nu este permis din motive de securitate.

Poate cineva să identifice ce fac greșit? Am presupus că am permis tipul MIME pentru CSV în codul de mai sus.

0
Toate răspunsurile la întrebare 3
1

Există un bug în WordPress 4.7-4.7.3 legat de validarea tipurilor MIME, așa că codul furnizat de Dave Romsey nu va funcționa.

Există un plugin în repository care ocolesc verificările MIME, dar dezactivează aceste verificări pentru toți utilizatorii și toate extensiile. Cred că o soluție mai bună ar fi să adăugăm o nouă capabilitate pentru administratori care să le permită să încarce fișiere cu extensia .csv.

//* Înregistrează hook-uri pentru activare și dezactivare
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );

//* Adaugă capabilitatea upload_csv rolului de administrator
function wpse_258192_activation() {
  $admin = get_role( 'administrator' );
  $admin->add_cap( 'upload_csv' );
}

//* Elimină capabilitatea upload_csv din rolul de administrator
function wpse_258192_deactivation() {
  $admin = get_role( 'administrator' );
  $admin->remove_cap( 'upload_csv' );
}

//* Adaugă filtru pentru verificarea tipului de fișier și extensiei
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );

//* Dacă utilizatorul curent are dreptul upload_csv și extensia fișierului este csv, suprascrie argumentele - edit - "$pathinfo" schimbat în "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
Comentarii

Nu sunt sigur dacă acest cod este vechi sau nu, dar nu mai funcționează.

David Rhoderick David Rhoderick
6 aug. 2020 16:19:28
1

Dacă dorești o soluție temporară rapidă și ușoară, poți permite încărcări nefiltrate în fișierul tău wp-config.php.

define('ALLOW_UNFILTERED_UPLOADS', true);

Această linie de cod probabil nu ar trebui să rămână în config.php, dar dacă vrei să faci ceva precum un import de produse WooCommerce prin CSV doar o singură dată, poate fi o soluție ușoară.

25 feb. 2020 13:52:53
Comentarii

Ca o soluție rapidă (și apoi eliminând-o din wp-config.php imediat după), aceasta a funcționat pentru mine.

Nathan Nathan
31 aug. 2020 21:11:49
2

În mod implicit, WordPress blochează încărcarea fișierelor .csv. Filtru mime_types vă va permite să adăugați fișiere .csv sau orice alt tip de fișier pentru încărcare:

add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
    // Adaugă csv la lista de tipuri mime permise
    $existing_mimes['csv'] = 'text/csv';

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

Deci, având în vedere acest lucru, pentru ce este folosită suprascrierea mime a media_handle_upload?

fightstarr20 fightstarr20
28 feb. 2017 00:59:04

De fapt, array-ul $mimes din array-ul $overrides are același scop până la urmă. Așadar, problema ar putea proveni din bug-ul menționat de Nathan Johnson în răspunsul său. (Aveam activat un cod în mediul meu de testare care suprascria verificarea mime din cauza bug-ului, lucru pe care l-am uitat :)

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