2016-10-14 14 views
0

Ich verwende folgenden Code meine Dateien hochladen:PHP temp_name und move_uploaded_file Fehler

<?php include("./phpincludes/header.inc.php"); 

    $status = ""; 

    if(@$_POST['submit']){ 

     $pic = @$_FILES['pic']['name']; 
     $pic_temp = @$_FILES['pic']['tmp_name']; 
     $pic_type = @$_FILES['pic']['type']; 
     $pic_size = @$_FILES['pic']['size']; 

     $doc1 = @$_FILES['doc1']['name']; 
     $doc1_temp = @$_FILES['doc1']['tmp_name']; 
     $doc1_type = @$_FILES['doc1']['type']; 
     $doc1_size = @$_FILES['doc1']['size']; 

     $doc2 = @$_FILES['doc2']['name']; 
     $doc2_temp = @$_FILES['doc2']['tmp_name']; 
     $doc2_type = @$_FILES['doc2']['type']; 
     $doc2_size = @$_FILES['doc2']['size']; 

     $name = stripcslashes(htmlspecialchars(urldecode($_POST['name']))); 
     $phone1 = stripcslashes(htmlspecialchars(urldecode($_POST['phone1']))); 
     $phone2 = stripcslashes(htmlspecialchars(urldecode($_POST['phone2']))); 
     $address = stripcslashes(htmlspecialchars(urldecode($_POST['address']))); 
     $sec = stripcslashes(htmlspecialchars(urldecode($_POST['sec_amount']))); 

     if($name != ""){ 


      if($pic_size <= 1048576){ 
       if (!$pic_temp) { // if file not chosen 
        echo "ERROR: Please browse for a file before clicking the upload button. ".$pic_temp; 
       } 
       $chars = "abcdefghijklmnopqrstuvrstwxyzABCDEFGHIJKLMNOPQRSTUVWXWZ"; 
       $rand_dir_name = $name." ".substr(str_shuffle($chars), 0, 6); 

       mkdir("uploads/vendors/$rand_dir_name"); 
       move_uploaded_file($doc1_temp, "uploads/vendors/$rand_dir_name/$doc1"); 
       move_uploaded_file($doc2_temp, "uploads/vendors/$rand_dir_name/$doc2"); 
       if(move_uploaded_file($pic_temp, "uploads/vendors/$rand_dir_name/$pic")){ 
        echo "uploads/vendors/$rand_dir_name/$pic"; 
       } else { 
        echo "move_uploaded_file function failed"; 
       } 

      }else{ 
       echo "Image size should be less than 1 MB!"; 
      } 

     }else{ 
      echo "Name is neccassary!"; 
     } 


    } 

?> 

aber das Problem ist, dass es mir Fehler gibt beim Hochladen der Datei ‚ERROR: Bitte für eine Datei suchen, bevor Sie den Upload klicken Taste.' und 'move_uploaded_file function failed'. Ich denke, dass das Problem mit dem @ vor Dateien ist, aber wenn ich es entferne, gibt es mir Fehler des undefinierten Indexes.

Mein HTML-Formular: -

<form method='POST' name='form'> 
       <td><h4>Photo:</h4><input type='file' name='pic' accept="image/gif, image/jpeg, image/png"><h4>Full Name:</h4><input class='tableinput' type='text' placeholder='Name' name='name'></td> 
       <td><h4>Phone 1:</h4><input class='tableinput' type='text' placeholder='Phone' name='phone1'> 
       <h4>Phone 2:</h4><input class='tableinput' type='text' placeholder='Phone' name='phone2'></td> 
       <td> 
        <h4>Document 1:</h4> 
        <input type='file' name='doc1'> 

        <h4>Document 2:</h4> 
        <input type='file' name='doc2'> 
       </td> 
       <td><h4>Service:</h4><input class='tableinput' type='text' placeholder='Service' name='services'> 
       <h4>Address:</h4><input class='tableinput' type='text' placeholder='Address' name='address'></td> 
       <td> <input class='tableinput' type='text' placeholder='Sercurity Amount' name='sec_amount'></td> 
       <td > 
        <input type='submit' id='submit' name='submit' style='display:none;'/> 
        <i class='glyphicon glyphicon-ok-sign tableglyp blue' aria-hidden='true' onclick='submit()'> 
        </i> 
       </td> 
       </form> 

Bitte um Hilfe!

+1

@ unterdrückt die Fehler/Warnungen aus der Ansicht. scheint, dass '$ _FILES'-Werte in einigen Fällen nicht gesetzt sein könnten. Bitte überprüfen Sie, ob Sie den Wert von $ FILES erhalten. Verwenden Sie 'var_dump' oder' print_r' – Thamaraiselvam

+0

Lassen Sie uns Ihr Formular sehen HTML – Rasclatt

+0

@Rasclatt Sehen Sie meine HTML-Formular in meinem Beitrag – Zicsus

Antwort

0

Der Hauptgrund für Ihre Fehler sind:

1) Die HTML-Datei auf dem Formular nicht Dateien passieren, weil Formular-Tag Attribut fehlt

2) Ihre Logik den Status der Dinge für die Überprüfung ist fehlerhaft .

3) Sie tun, Ihre Verarbeitung sehr manuell

4) Verwenden Sie das @ Symbol sparsam (wie fast nie in), Sie wollen Fehler beheben

Hier ist ein sehr einfacher Upload-Skript Sieh dir das an. Zu Beginn möchte ich das Array $_FILES zuerst organisieren, es macht es für mich lesbarer. Schließlich machen den Business-Logik in Funktionen, so dass Sie ihre Logik von der Seite bekommen (Sie würden sie gehören, wenn Sie sie verwenden möchten):

/functions/getFiles.php

function getFiles() 
    { 
     $files = array(); 
     foreach($_FILES as $keyname => $files) { 
      foreach($_FILES[$keyname]['name'] as $key => $value) { 
       if($_FILES[$keyname]['error'][$key] != 0) 
        continue; 

       $file[$keyname][$key]['name']  = $_FILES[$keyname]['name'][$key]; 
       $file[$keyname][$key]['type']  = $_FILES[$keyname]['type'][$key]; 
       $file[$keyname][$key]['tmp_name'] = $_FILES[$keyname]['tmp_name'][$key]; 
       $file[$keyname][$key]['error']  = $_FILES[$keyname]['error'][$key]; 
       $file[$keyname][$key]['size']  = $_FILES[$keyname]['size'][$key]; 
      } 
     } 

     return $file; 
    } 

diese Funktion schaltet den $_FILES Array aus:

Array 
(
    [pic] => Array 
     (
      [name] => Array 
       (
        [0] => IMG_7506.JPG.jpeg 
       ) 

      [type] => Array 
       (
        [0] => image/jpeg 
       ) 

      [tmp_name] => Array 
       (
        [0] => /datatmp/phpTNMUP2 
       ) 

      [error] => Array 
       (
        [0] => 0 
       ) 

      [size] => Array 
       (
        [0] => 1003150 
       ) 

     ) 

    [doc] => Array 
     (
      [name] => Array 
       (
        [0] => gI_0_DiscoveryLogovertical1.jpg 
        [1] => gI_0_DiscoveryLogovertical2.jpg 
       ) 

      [type] => Array 
       (
        [0] => image/jpeg 
        [1] => image/jpeg 
       ) 

      [tmp_name] => Array 
       (
        [0] => /datatmp/phpjY1IYG 
        [1] => /datatmp/phpVsX37k 
       ) 

      [error] => Array 
       (
        [0] => 0 
        [1] => 0 
       ) 

      [size] => Array 
       (
        [0] => 43318 
        [1] => 43318 
       ) 

     ) 

) 

zu:

Array 
(
    [pic] => Array 
     (
      [0] => Array 
       (
        [name] => IMG_7506.JPG.jpeg 
        [type] => image/jpeg 
        [tmp_name] => /datatmp/phpTNMUP2 
        [error] => 0 
        [size] => 1003150 
       ) 

     ) 

    [doc] => Array 
     (
      [0] => Array 
       (
        [name] => gI_0_DiscoveryLogovertical1.jpg 
        [type] => image/jpeg 
        [tmp_name] => /datatmp/phpjY1IYG 
        [error] => 0 
        [size] => 43318 
       ) 

      [1] => Array 
       (
        [name] => gI_0_DiscoveryLogovertical2.jpg 
        [type] => image/jpeg 
        [tmp_name] => /datatmp/phpVsX37k 
        [error] => 0 
        [size] => 43318 
       ) 

     ) 

) 

Jetzt erstellen Sie eine Funktion, die das Hochladen durchführt. Hier ist ein einfaches Beispiel:

/functions/uploadFiles.php

function uploadFiles($files,$dir,&$errors,$max = 1048576) 
    { 
     if(!is_dir($dir)) { 
      if(!mkdir($dir,0755,true)) 
       throw new Exception('Upload folder could not be created.'); 
     } 

     foreach($files as $key => $file) { 
      $name = preg_replace('/[^a-zA-Z0-9\.\-\_]/','',$file['name']); 
      if(empty($name)) { 
       $error[$key][] = 'Name can not be empty.'; 
       continue; 
      } 

      if($file['size'] > $max) { 
       $errors[$key][] = htmlspecialchars($file['name']).' is too large ('.number_format($max/1024,0).' KB max)'; 
       continue; 
      } 

      if(!move_uploaded_file($file['tmp_name'],$dir.$file['name'])) 
       $errors[$key][] = 'File could not be uploaded'; 
     } 
    } 

Es ist einfacher, dies als eine wiederverwendbare Funktion haben:

/functions/createRandName.php

function createRandName($name) 
    { 
     $chars = "abcdefghijklmnopqrstuvrstwxyzABCDEFGHIJKLMNOPQRSTUVWXWZ"; 
     return $name." ".substr(str_shuffle($chars), 0, 6); 
    } 

zu benutzen:

# Include the functions here 
require_once(__DIR__.'/functions/createRandName.php'); 
# ...etc. 

# Set your error array 
$errors = array(); 

#check that a post is set 
if(!empty($_POST['submit'])) { 
    # Create the directory 
    $dir = __DIR__.'/'.createRandName(preg_replace('/[^0-9a-zA-Z\s\_\-]/','',$_POST['name'])).'/'; 
    # Because the upload hinges on a folder being created first that doesn't 
    # already exist, we want to stop the process as a whole if the directory 
    # fails to be created 
    try { 
     # Organize the files and loop through them 
     foreach(getFiles() as $input => $files) { 
      # Upload the files 
      uploadFiles($files,$dir,$errors); 
     } 
    } 
    catch (Exception $e) { 
     $errors[] = $e->getMessage(); 
    } 
} 
# Report errors 
if(!empty($errors)) 
    print_r($errors); 
?> 

Ihr Formular-Tag benötigt zum Hochladen von Dateien enctype='multipart/form-data'. Sie sollten alle Ihre Dateinamen so anordnen pic[] und doc[], auch wenn Sie nur eine Datei haben. Auf diese Weise können Ihre Dateien alle denselben Upload-Mechanismus verwenden.

<table> 
    <form method='POST' name='form' enctype='multipart/form-data'> 
     <td> 
      <h4>Photo:</h4> 
      <input type='file' name='pic[]' accept="image/gif, image/jpeg, image/png"> 
      <h4>Full Name:</h4> 
      <input class='tableinput' type='text' placeholder='Name' name='name'> 
     </td> 
     <td> 
      <h4>Phone 1:</h4> 
      <input class='tableinput' type='text' placeholder='Phone' name='phone[1]'> 
      <h4>Phone 2:</h4> 
      <input class='tableinput' type='text' placeholder='Phone' name='phone[2]'></td> 
     <td> 
      <h4>Document 1:</h4> 
      <input type='file' name='doc[]'> 

      <h4>Document 2:</h4> 
      <input type='file' name='doc[]'> 
     </td> 
     <td> 
      <h4>Service:</h4> 
      <input class='tableinput' type='text' placeholder='Service' name='services'> 
      <h4>Address:</h4> 
      <input class='tableinput' type='text' placeholder='Address' name='address'> 
     </td> 
     <td> 
      <input class='tableinput' type='text' placeholder='Sercurity Amount' name='sec_amount'> 
     </td> 
     <td> 
      <input type='submit' id='submit' name='submit' /> 
      <i class='glyphicon glyphicon-ok-sign tableglyp blue' aria-hidden='true' onclick='submit()'></i> 
     </td> 
    </form> 
</table> 

Mit diesem Formular Layout Formular Post Array würde wie folgt aussehen:

Array 
(
    [name] => My Name 
    [phone] => Array 
     (
      [1] => 123-123-1233 
      [2] => 321-698-7894 
     ) 

    [services] => Something 
    [address] => 123 My Street 
    [sec_amount] => 123 
    [submit] => Submit 
) 
Verwandte Themen