web-dev-qa-db-fra.com

Impossible de télécharger un type de fichier .Zip spécifique via une interface dans WordPress 4.0

J'autorise le téléchargement de quelques types de fichiers sélectionnés à partir du client, par exemple. .Zip, .mp4, .jpeg et .pdf. Jusqu'à présent, tous ces types de fichiers n'avaient aucun problème à être attachés à la publication à laquelle ils ont été téléchargés. Cependant, après la mise à niveau vers WordPress 4.0, je n'ai pas été en mesure de télécharger un type de fichier .Zip spécifique à partir du client, bien que le téléchargement s'effectue correctement à partir du backend à l'aide de l'interface de téléchargement multimédia. Veuillez noter que les autres types de fichiers. Les fichiers .mp4 et .pdf sont toujours joints, sans aucun problème.

Ci-dessous est l'ensemble du code qui remplit la fonction de pièce jointe.

if ( isset( $_POST['upload_attachments'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' && wp_verify_nonce($_POST['secure_upload'], 'upload_attachments_nonce')) {

    //checking if upload is empty
    //checking if universal filesize is valid

    if ($_FILES) { //loop through multiple files.         
        $files = $_FILES['upload'];
        foreach ($files['name'] as $key => $value) {
            if ($files['name'][$key]) {
                $file = array(
                    'name'     => $files['name'][$key],
                    'type'     => $files['type'][$key],
                    'tmp_name' => $files['tmp_name'][$key],
                    'error'    => $files['error'][$key],
                    'size'     => $files['size'][$key]
                );

                $uploaded_file_type = $files['type'][$key];
                $allowed_file_types = array('image/jpg', 'image/jpeg', 'image/png', 'application/pdf', 'application/Zip', 'video/mp4');
                $uploaded_file_size = $files['size'][$key];
                $size_in_kb = $uploaded_file_size / 1024;
                $file_size_limit = 10000; // Your Filesize in KB


                if(in_array($uploaded_file_type,  $allowed_file_types)) { 
                   if( $size_in_kb > $file_size_limit ) {
                   $upload_error .= 'Image files must be smaller than '.$file_size_limit.'KB';
                   return;
                   } else {
                   $_FILES = array("upload" => $file);
                   foreach ($_FILES as $file => $array) {
                   $newupload = insert_attachment($file,$post_id);
                   //return; this loop neds to run multiple times so no return here
                 }      
                 }
                 } else { $upload_error .= 'Invalid File type';
                         return;
                        }                                                              

                }
            }
        }                  

    header ('Location: ' . $_SERVER['REQUEST_URI']);//Post, redirect and get
    exit();
    }//end of nonce check 

Fonction d'assistance insert_attachment de goldenapples

function insert_attachment($file_handler,$post_id,$setthumb='false') {

    // check to make sure its a successful upload
    if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK) __return_false();

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

    $attach_id = media_handle_upload( $file_handler, $post_id );

    //if ($setthumb) update_post_meta($post_id,'_thumbnail_id',$attach_id);
    return $attach_id;
}

Forme Html

<form method="post" id="frontend-attachment-upload-form" action="" enctype="multipart/form-data" >
<input type="file" multiple="true" name="upload[]">   

<?php wp_nonce_field('upload_attachments_nonce','secure_upload'); ?>
<input type="submit" id="upload_attachments_button" name="upload_attachments" value="UPLOAD">
<form>

Le fichier .Zip n'est pas téléchargé du tout, sinon je les trouverais dans la médiathèque, même si elles n'étaient pas attachées. Lorsque j'essaie de télécharger un fichier .Zip dans l'interface frontale, il renvoie simplement le type de fichier non valide pour l'erreur. Comme vous pouvez le constater, cette ligne définit clairement tous les types de fichiers:

$allowed_file_types = array('image/jpg', 'image/jpeg', 'image/png', 'application/pdf', 'application/Zip', 'video/mp4');

Alors, comment se fait-il que les fichiers .mp4, .pdf, .jpeg que tous les autres types de fichiers soient correctement attachés et que les fichiers .Zip ne le soient pas? Logiquement, s'il y avait une erreur dans la boucle, aucun type de fichier ne serait chargé du tout. Aussi, le fait est que les fichiers .Zip ont été téléchargés correctement il y a quelques jours. Je n'ai aucune idée de ce qui se passe. Un peu d'aide sera apprécié s'il vous plaît.


Juste au cas où je vérifie les types de fichiers autorisés et que le type de fichier .Zip est autorisé. Donc, est-il possible que wordpress ait apporté des modifications dans image.php ou file.php ou media.php qui interdiraient le téléchargement de types de fichiers spécifiques dans l'interface frontale?

<?php $allowed_mimes = get_allowed_mime_types();
        echo '<pre>';
        print_r($allowed_mimes);
        echo '</pre>';
        ?>

MISE À JOUR: Ce problème a été résolu, veuillez regarder la réponse acceptée.

2
gurung

* Je pensais écrire ceci sous forme de mise à jour, mais j’ai ensuite pensé qu’il était préférable de fournir la solution comme réponse car il est possible que la solution soit ignorée lors de la mise à jour de la question.

Il n'y a aucune erreur dans mon code ou dans la boucle d'ailleurs. Ce n'est pas non plus une mauvaise configuration du serveur. Dans le cadre du débogage, je renvoyais en écho les types de fichiers téléchargés et je réalisais que lorsque je télécharge un fichier .Zip, il renvoie application/x-Zip-compressed au lieu de ce que je pensais être application/Zip. Donc, un petit changement dans le code a fait le travail.

$allowed_file_types = array('application/x-Zip-compressed', 'other file types......');

Ci-dessus fonctionne bien maintenant, notez également que le fichier .rar doit être application/x-rar-compressed. J'aurais aimé que cela soit mentionné sur la page de la page de codex pertinente . Je suis toujours sûr que c'est quelque chose qui est venu avec WordPress 4.0. Merci à @ialocin et @aifrim et à d’autres personnes pour leur aide.

0
gurung

Vous devez mettre à jour les types MIME autorisés par WordPress dans ses paramètres.

Pour les fichiers Zip/rar:

function my_modify_mimes( $mimes ) {

    $mimes['Zip'] = 'application/Zip';
    $mimes['rar'] = 'application/x-rar-compressed';

    return $mimes;
}

add_filter( 'upload_mimes', 'my_modify_mimes' );

En outre, si vous effectuez un téléchargement à partir du serveur frontal, vous devez filtrer les personnes ayant accès à certains types de mime par rôles/fonctionnalités.

Rar/zips sont également identifiés avec ce type mime: application/octet-stream si des erreurs se produisent.

0
aifrim