3 votes

Passer le fichier téléchargé entre les scripts PHP

J'ai une page où les utilisateurs peuvent télécharger un fichier HTML pour l'utiliser comme thème. Le fichier HTML fait l'objet de quelques vérifications avant que certaines options ne soient affichées à l'utilisateur. L'utilisateur remplit le formulaire en relation avec le fichier HTML, et soumet le formulaire. Cependant, étant donné que le fichier dans le dossier temporaire est détruit après la fin du script, je ne sais pas comment obtenir le fichier HTML une fois que le formulaire a été rempli et soumis à nouveau, à moins de demander à l'utilisateur de retélécharger le fichier, ce qui suppose qu'il télécharge le même fichier, et lui demande également de télécharger quelque chose deux fois, ce qui est contre-intuitif et pourrait poser un problème avec les gros fichiers.
Voici le code (réduit pour le rendre plus facile à lire/comprendre). Le formulaire se soumet à lui-même, donc le même fichier PHP est utilisé pour les deux "étapes".

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // Form has been submitted
    $files = $_FILES['file'];
    <form method="POST">
        /* Options about the uploaded HTML file are generated using PHP and displayed here */
        <input type="submit">
    </form>
} else {
    ?>
    <form method="POST" enctype="multipart/form-data">
        <label for="file">Theme File(s)</label>
        <input type="file" name="file[]" multiple="multiple">
        <input type="submit">
    </form>
    <?php
}

J'ai essayé d'utiliser <input type="file" name="file[]" multiple="multiple" value="<?php echo $files; ?> > Mais cela n'a pas fonctionné, et l'utilisateur aurait dû retélécharger les fichiers, ce qui aurait pu poser problème si les fichiers étaient trop volumineux.
Je pensais qu'il pourrait y avoir un moyen de passer le fichier en interne, et d'avoir une vérification si un fichier a été téléchargé ou passé au script au lieu de <input type="file" name="file[]" multiple="multiple"> mais je n'ai pas trouvé le moyen de le faire.

2voto

DaveRandom Points 45661

Vous devez créer votre propre fichier temporaire, et passer le nom entre vos deux scripts.

Ainsi, par exemple, dans votre "premier script" (c'est-à-dire lorsque le fichier a été téléchargé pour la première fois), vous devriez.. :

$uniqName = uniqid('upload_', TRUE);
$tmpFile = "/tmp/$uniqName.html";
move_uploaded_file($_FILES['file']['tmp_name'][0], $tmpFile);

Et ensuite, lorsque vous générez le formulaire à partir du résultat de ce téléchargement, vous ajoutez

<input type="hidden" name="uniqName" value="<?php echo $uniqName; ?>" />

...de sorte que, lorsque vous arrivez à votre "deuxième script" (après l'envoi du formulaire de questionnaire), vous pouvez accéder au fichier par le biais de.. :

$tmpFile = "/tmp/".basename($_REQUEST['uniqName']).".html";

Bien sûr, il est possible que des personnes ne soumettent pas le deuxième formulaire et que vous vous retrouviez avec des "fichiers orphelins" dans votre répertoire temporaire. Vous devrez donc mettre en place une forme de contrôle qui supprime les fichiers après qu'ils aient été inactifs pendant un certain temps - vous pouvez vous baser sur la dernière date de modification des fichiers.

EDIT

Voici un exemple de la façon dont vous pouvez exécuter un travail de façon aléatoire afin de garder la /tmp dir tidy sans tâche cron :

$probabilityDivisor = 10; // 1/10 chance of running
$uploadTTLSecs = 1800; // 30 minutes

if (mt_rand(1, $probabilityDivisor) / $probabilityDivisor == 1) {
  foreach (glob('/tmp/upload_*') as $file) {
    // Iterate files matching the uniqids you generate
    if (time() - filemtime($file) >= $uploadTTLSecs) {
      // If file is older than $uploadTTLSecs, delete it
      unlink($file);
    }
  }
}

Le fonctionnement est similaire à celui de la méthode PHP collecteurs d'ordures de session . En raison de la simplicité des opérations, cela ne devrait pas nuire à l'expérience de l'utilisateur de manière significative.

0voto

maximus 69 Points 1248

Vous pouvez essayer ce qui suit :

  1. Utilisez move_uploaded_file() et déplacez le fichier de l'emplacement temporaire vers un emplacement permanent sur le serveur. Veillez à donner au fichier que vous déplacez un nom unique comme "fichier-" . time() . '.jpg' ou autre.

  2. Peu après le téléchargement, enregistrez une variable Session et mettez-y le nom du fichier.

  3. Une fois que tout est terminé, vous pouvez supprimer le fichier en utilisant unset()

Maintenant, le fichier se trouve en sécurité sur votre serveur et vous y avez également accès via la session.

J'espère que cela vous aidera :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X