jQuary télécharger, mais de manière asynchrone paire deux fichiers dans un seul téléchargement

voix
0

J'ai un formulaire de téléchargement de fichiers qui permet de sélectionner autant de fichiers (uniquement les fichiers .xml et .yml) que vous souhaitez télécharger. Le formulaire est créé avec de blueimp jQuery de téléchargement de fichiers . Je l'information contenue dans cette question pour que tout fonctionne.

Les fichiers .xml et .yml viennent toujours par paires et contiennent des informations différentes à un bloc de données. Les fichiers téléchargés sont gérés par un fichier .php séparé. Là, je vérifie si le fichier correspondant est déjà téléchargé. Si tel est le cas, je commence un processus pour gérer les deux fichiers.

Il fonctionne très bien dans la plupart des cas, mais parfois je reçois des messages câblés de retour et il semble que qu'il est possible de démarrer le code et le processus deux fois parse. Je soupçonne que le chargement du fichier correspondant vient de terminer avant le premier fichier vérifié si les deux existent. Ensuite, le premier fichier commence le processus et le second fichier commence ainsi.

function process_uploaded_data(&$response, $file_path) {
    $file_name = get_file_name($file_path);
    $yml_path = 'tmp/'. $file_name .'.yml';
    $xml_path = 'tmp/'. $file_name .'.xml';

    if(file_exists($xml_path) && file_exists($yml_path))
    {
        // parse and process yml and xml
    }
}

// A list of permitted file extensions
$allowed = array('xml', 'yml');

if(isset($_FILES['upl']) && 0 >= $_FILES['upl']['error']){

    $extension = pathinfo($_FILES['upl']['name'], PATHINFO_EXTENSION);

    if(!in_array(strtolower($extension), $allowed)) {
        $response['file'] = $_FILES['upl']['name'];
        $response['status'] = 'failed';
        echo json_encode($response);
        exit;
    }

    if(move_uploaded_file($_FILES['upl']['tmp_name'], 'tmp/'.$_FILES['upl']['name'])){
        $response['file'] = $_FILES['upl']['name'];
        $response['status'] = 'success';

        process_uploaded_data($response, 'tmp/'.$_FILES['upl']['name']);

        echo json_encode($response);
        exit;
    }
}

echo '{status:error}';
exit;

Pour résoudre ce problème, je voudrais associer les deux fichiers sur le côté client et de télécharger les deux fichiers à la fois. Pour réécrire les serveurs script PHP comme c'est pas de problème, mais comment puis-je vérifier et regrouper les fichiers JS?

De toute évidence, je dois retarder var jqXHR = data.submit();la add: function. Mais j'ai quelques questions:

  1. Où et comment puis-je accéder à la liste complète des fichiers sélectionnés?

  2. Quand je l'ai apparié les fichiers correspondants, comment puis-je déclencher un téléchargement de fichiers à deux?

Voici une version plus petite de ma forme de téléchargement:

<!DOCTYPE html>
<html>
<head>
    <script src=javascripts/modernizr.js></script>
    <script src=javascripts/respond.min.js></script>
    <script src=javascripts/prefixfree.min.js></script>
    <script src=javascripts/jquery-3.4.1.min.js></script>

    <script src=javascripts/vendor/jquery.ui.widget.js></script>
    <script src=javascripts/jquery.iframe-transport.js></script>
    <script src=javascripts/jquery.fileupload.js></script>

    <script>
        $(function() {
            var ul = $('#upload ul');

            $('#upload').fileupload({
                url: 'sql_upload.php',
                dataType: 'text',
                type: 'post',

                // This function is called when a file is added to the queue
                add: function (e, data) {                   
                    //This area will contain file list and progress information.
                    var tpl = $('<li><p class=file_name></p></li>');

                    // Append the file name and file size
                    tpl.find('p').text(data.files[0].name);

                    // Add the HTML to the UL element
                    data.context = tpl.appendTo(ul);

                    // Automatically upload the file once it is added to the queue
                    var jqXHR = data.submit();
                },
                success: function(php_script_response){
                    console.log(php_script_response);
                }
            });
        })
    </script>
</head>
<body>
    <form id=upload enctype=multipart/form-data>
        <input type=file name=upl multiple />
        <ul id=fileList>
            <!-- The file list will be shown here -->
        </ul>
    </form>
</body>
</html>
Créé 24/10/2019 à 12:53
source utilisateur
Dans d'autres langues...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more