2017-01-17 5 views
0

J'ai un formulaire à partir duquel je rassemble pas mal d'informations et que je dois ensuite télécharger plusieurs fichiers.Téléchargement de plusieurs fichiers vers le serveur à partir du formulaire

Tous les autres aspects du formulaire fonctionnent maintenant parfaitement grâce à Devi sur ce forum. Et pour essayer de me concentrer sur le seul problème que j'ai maintenant j'ai décidé de commencer le nouveau fil: Le fil précédent/ancien peut être vu Insert into one Table, while updating another & File Upload

Mon problème maintenant est d'obtenir réellement les fichiers à télécharger. Ma forme travaille en deux parties. La première partie est la mise en page HTML de base qui a ensuite la méthode pointant vers le fichier PHP qui gère l'écriture d'informations dans les tables de la base de données.

Le formulaire a le code suivant pour chaque téléchargement de fichier (Il y a 4 téléchargements, chacun pour une référence de fichier différent, à savoir le document de licence, le renouvellement du document, document d'identité, d'autres documents.):

<div class="form-group"> 
    <label>Permit Renewal :</label> 
    <div class="input-group"> 
     <label> 
     <input type="radio" class="minimal" value="0" <?php echo ($permit_renewal=='No')?'checked':'' ?> name="permit_renewal"> 
     No 
     </label> 

     <label> 
     <input type="radio" class="minimal" value="1" <?php echo ($permit_renewal=='Yes')?'checked':'' ?> name="permit_renewal"> 
     Yes 
     </label> 
    </div> 
</div> 
<div class="box-body"> 
<div class="form-group">  
    <div class="form-group"> 
     <label for="scanned_permit_renewal">Attach File</label> 
     <input type="file" id="scanned_permit_renewal" name="scanned_permit_renewal"> 
     <p class="help-block">Select a file to link to this outlet, the file name must be prefixed with the Outlet. E.g. 102987 - License 2016</p> 
    </div>     
</div><!-- /.form-group --> 

Et la partie de traitement pertinent est

if (isset($_FILES["file"]["name"])) { 
    foreach($_FILES['file']['tmp_name'] as $key => $tmp_name){ 
     $file_name = $key.$_FILES['file']['name'][$key]; 
     $file_size =$_FILES['file']['size'][$key]; 
     $file_tmp =$_FILES['file']['tmp_name'][$key]; 
     $file_type=$_FILES['file']['type'][$key]; 
     $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name; 
     //echo $new_file; 
     move_uploaded_file($file_tmp,$new_file); 
    } 
} 
if($res1){ 
    echo "Records added/updated successfully."; 
} 

header("refresh:2;url=../outlet_capture.php"); 
// close connection 
$link->close(); 

J'ai aussi confirmé mon répertoire de pourriture et a assuré qu'il ya un/uploads/présent dossier.

+0

JFYI, ce site est pas forum et question demandant de réparer votre code sont hors sujet. –

Répondre

0

Vous avez fait tout droit, vous êtes tout simplement pas pointant vers les noms d'entrée droite ...

$_FILES['file'] n'existe pas. Vous devriez utiliser $_FILES['scanned_permit_renewal'] à la place, tout comme lorsque vous accédez à $_POST, la clé est le nom du champ de formulaire.

En fait, vous Boucler dans la $_FILES['file'] comme si vous aviez mis beaucoup d'entrées avec le nom file[*something*]. Si vous remettez en question est terminée, vous devriez simplement en utilisant

if (isset($_FILES["scanned_permit_renewal"])) { 
    $file_name = $_FILES['scanned_permit_renewal']['name']; 
    $file_size =$_FILES['scanned_permit_renewal']['size']; 
    $file_tmp =$_FILES['scanned_permit_renewal']['tmp_name']; 
    $file_type=$_FILES['scanned_permit_renewal']['type']; 
    $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name; 
    //echo $new_file; 
    move_uploaded_file($file_tmp,$new_file); 
} 

Pour répondre à votre commentaire, un moyen efficace de le faire pourrait être de 2 façons. Tout d'abord, qui ne nécessitera aucune modification de PHP, renommez vos champs de saisie en file[scanned_permit_renewal] cela vous permettra d'utiliser le foreach comme vous le souhaitez.

Un autre moyen pourrait consister à utiliser un tableau d'entrées possibles:

$file_inputs = array('scanned_permit_renewal','my','other','documents'); 
foreach($file_inputs as $input_name){ 
    if (isset($_FILES[$input_name])) { 
     $file_name = $input_name.$_FILES[$input_name]['name']; 
     $file_size =$_FILES[$input_name]['size']; 
     $file_tmp =$_FILES[$input_name]['tmp_name']; 
     $file_type=$_FILES[$input_name]['type']; 
     $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name; 
     //echo $new_file; 
     move_uploaded_file($file_tmp,$new_file); 
    } 
} 

Une troisième voie peut être à boucle juste à travers le réseau $_FILES. Mais je ne ferais pas cela, car il pourrait y avoir quelque chose là-bas. Vous préférerez filtrer sur vos fichiers recherchés.

+0

Donc pour chaque fichier que je veux ajouter, je devrais ajouter la section de code qui dit if (isset ($ _FICHES ["fichier"] ["nom"])) { foreach ($ _ FICHIERS ['fichier'] [ 'tmp_name'] comme $ key => $ tmp_name) etc ...? Est-ce que/ou est-ce qu'il n'y a pas une manière plus facile/plus efficace de faire cela? –

+0

D'accord, l'option deux semble la mieux fonctionner pour moi, car j'ai besoin d'écrire la valeur du champ à 4 colonnes séparées dans ma table de base de données afin que je puisse plus tard faire référence au nom du fichier pour l'afficher. Ma première tentative d'utilisation de la série d'entrées n'a pas fonctionné, alors laissez-moi essayer de travailler dessus. –

+0

Vous préférerez peut-être ne pas utiliser le nom de fichier d'origine car il pourrait y avoir des conflits de noms ... Je préfèrerais utiliser l'ID de la ligne mysql liée aux fichiers, et ajouter le type de fichier. De cette façon, vous n'avez pas besoin de stocker vos noms de fichiers dans la base de données, et si deux personnes différentes utilisent le même nom de fichier, elles ne vont pas écraser les autres, ce qui pourrait devenir très dangereux. – Salketer

0

Si vous ne voyez pas la définition, mais il doit avoir le enctype comme

La variable $ _FILES fonctionne avec le nom du champ sous la forme. Dans votre exemple, cela devrait être scanned_permit_renewal. Et pour y accéder à partir du PHP lorsque le formulaire a été envoyé, vous devez utiliser $ _FILES ['scanned_permit_renewal'].

Vous utilise le foreach

foreach($_FILES['file']['tmp_name'] as $key => $tmp_name) 

Ce qui semble être le problème.

à mon humble avis, vous devez utiliser ceci:

foreach($_FILES as $fieldNameInTheForm => $file) 
{ 
    $file_name = $fieldNameInTheForm .$file['name']; 
    $file_size =$file['size']; 
    $file_tmp =$file['tmp_name']; 
    $file_type=$file['type']; 
    $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name; 
    //echo $new_file; 
    move_uploaded_file($file_tmp,$new_file); 
} 
0

Pour le téléchargement de fichiers multiples, champ de saisie doit être:

<input type="file" id="scanned_permit_renewal" name="scanned_permit_renewal[]" multiple="multiple"> 

partie de traitement:

if (count($_FILES["scanned_permit_renewal"]["name"]) > 0) { 
foreach($_FILES['scanned_permit_renewal']['tmp_name'] as $key => $tmp_name) 
{ 
    $file_name = $key.$_FILES['scanned_permit_renewal']['name'][$key]; 
    $file_size =$_FILES['scanned_permit_renewal']['size'][$key]; 
    $file_tmp =$_FILES['scanned_permit_renewal']['tmp_name'][$key]; 
    $file_type=$_FILES['scanned_permit_renewal']['type'][$key]; 
    $file_to_save = date("Ymd_his") . "_" . $file_name; 
    $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" .$file_to_save; 
    //echo $new_file; 
    if(move_uploaded_file($file_tmp,$new_file)){ 
     // update database 

     $query = "UPDATE `table` SET `field_name` = '".$file_to_save."' WHERE ..... "; 
    } 
} 
} 
+0

Ce serait le moyen idéal pour moi, ma seule préoccupation ici est que je veux aussi écrire le nom de fichier à une colonne spécifique dans mon tableau, une colonne pour permis scanné, puis document d'identité, etc Pour que je puisse utiliser le référence dans la base de données pour tirer le fichier particulier et l'afficher. –