Vraag & Antwoord

Webprogrammeren & scripting

Bestanden uploaden

Anoniem
None
9 antwoorden
  • Mij lukt het nite om meerdere bestanden naar de server toe te versturen.
    Ik weet dat de code een beetje lang is maar ik zie niet waar het mis gaat
    Ik zal stap voor stap uitleggen wat ik doe in de script.

    Het probleem begint in Stap 3. Ik krijg altijd het commentaar "The uploading process failed: an empty field is not aloud." Zelfs als ik wel de juiste bestanden heb geselecteerd

    Stap 1
    Selecteer eengewenste aantal aan bestanden die verzonden moeten worden
    [code:1:3053bc6144]
    <?
    echo "<FORM METHOD=POST ACTION=index.php?page=" . $_GET['page'] . "&map=". $_GET['map'] . "&module=". $_GET['module'] . "&action=new>";

    printf('<select name="files">');
    //create a list of fields
    for ($i = 1; $i <= 20; $i++)
    {
    printf('<option value="%1$s">%1$s', $i);
    }
    printf('</select> ');
    printf('<input type="submit" class="knop" value="Create fields">');
    printf('</form>');
    ?>
    [/code:1:3053bc6144]

    Step 2 Creeer het aantal opgevraagde velden
    [code:1:3053bc6144]
    <?
    //create fields
    if(isset($_POST['files']))
    {
    if ($_POST['files'])
    {
    echo "<FORM METHOD=POST ACTION=index.php?page=" . $_GET['page'] . "&map=". $_GET['map'] . "&module=". $_GET['module'] . "&action=". $_GET['action'] . ">";
    //create list
    for ($i = 1; $i <= $_POST['files']; $i++)
    {
    printf('<input type="file" name="file_%s" size="30"><br />', $i);
    }
    printf('<input type="button" onclick="javascript: history.back(-1);" value="Go back">');
    printf('<input type="submit" value="Upload files">');
    printf('<input type="hidden" name="history_files" value="%s">', $_POST['files']);
    printf('</form>');
    }
    }
    ?>
    [/code:1:3053bc6144]

    Step 3 De geselecteerde bestanden uploaden
    [code:1:3053bc6144]
    <?
    $upload_directory = $_SERVER['DOCUMENT_ROOT'] . "/dir/" . strtolower($sMap["map"]);
    $file_exts = array('.txt');
    //upload files
    printf('<b>Result:</b><br><BR>');

    for ($i = 1; $i <= $_POST['history_files']; $i++)
    {
    $_FILES['file_'.$i] = $_POST['file_'.$i];
    $tmp_filename = $_FILES['file_'.$i]['tmp_name'];
    $filename = $_FILES['file_'.$i]['name'];

    printf('%s',$filename);
    $file_ext = strtolower(substr($filename,strrpos($filename,".")));
    echo $file_ext;
    if (in_array($file_ext, $file_exts))
    {
    $status = "Correct file";
    }

    $filename = "rules_".strtolower($sMap["map"])."_";
    $n = 1;
    $path=$_SERVER['DOCUMENT_ROOT'] . "/dir/" . strtolower($sMap["map"]) . '/';

    while (file_exists($path . $filename . . $file_ext))
    {
    $n=$n+1;
    }

    if (in_array($file_ext, $file_exts))
    {
    if(move_uploaded_file($tmp_filename, $upload_directory.'/'.$filename.$n.$file_ext))
    {
    $status = '<b> The uploading process went well..</b>';
    }
    else
    {
    $status = '<b> There was an error..</b>';
    }

    }

    else
    {
    $status = '<b> The uploading process failed: an empty field is not aloud.</b>';
    }
    if($filename=="")
    $filename="——";
    printf('&nbsp;%s<BR>%s<BR><br>', ($filename)?$filename.$n.$file_ext:'&nbsp;', $status);
    printf('%s',$tmp_filename);
    //printf('%s',$path);
    }

    ?>
    [/code:1:3053bc6144]

    Om de fout ergens te kunnen achterhalen heb ik wat echoos geplaatst in de script

    als ik deze 2 regels 1 voor 1 uitprint
    [code:1:3053bc6144] $tmp_filename = $_FILES['file_'.$i]['tmp_name']; [/code:1:3053bc6144]of[code:1:3053bc6144]
    $filename = $_FILES['file_'.$i]['name'];[/code:1:3053bc6144]

    Krijg ik alleen een 'C' terug in plaats van een hele reeks karakters.
    Waarom is dat ??
  • Je overschrijft de superglobal $_FILES met waarden uit de $_POST, waarom is dat? Ik vermoed ook dat dat de reden is waarom je script fout loopt.

    [code:1:8632162c99]$_FILES['file_'.$i] = $_POST['file_'.$i];[/code:1:8632162c99]

    Overigens, ik heb nog een oud scriptje liggen waarmee je dynamisch een aantal fileuploads kan toevoegen aan de pagina. Misschien vind je dat interessant om te gebruiken.
    [size=9:8632162c99]Disclaimer: werkt bij mijn weten niet in Firefox, maar zeker weten doe ik dat niet. Code is redelijk oud en ik kan 'm hier niet testen (Geen Fx op werkplek).[/size:8632162c99]

    [code:1:8632162c99]
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns='http://www.w3.org/1999/xhtml'>
    <head>
    <title>multiple file upload</title>
    <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' />
    <style type="text/css">
    body { font-family: tahoma, arial; font-size: 12px; }
    h1 { font-size: 16px; }
    select#currentuploads { width: 400px; height: 100px; margin-bottom: 10px; }
    input.upload { width: 400px; margin-right: 10px; margin-bottom: 10px; }
    div#uploadcontainer { display: none; }
    </style>

    <script type="text/javascript">
    var n = 1; // counter
    var sFileAlreadyExists = "This file is already in the uploadlist.";
    var sFileUploadMaxReached = "No more file uploads allowed. Remove a file from the list before adding this one.";

    function removeUploadsFromList()
    {
    var oContainer = document.getElementById('uploadcontainer');
    var oFileInput;

    var oSelect = document.getElementById('currentuploads');
    var i = oSelect.options.length;
    while (i–)
    {
    if (oSelect.options[i].selected)
    {
    // remove upload input from form
    oFileInput = document.getElementById(oSelect.options[i].value);
    oContainer.removeChild(oFileInput);

    // remove item from selectbox
    oSelect.remove(i);
    }
    }
    }

    /**
    * Accepts an optional parameter (integer) to limit the amount of
    * allowed uploads to be added to the list.
    */
    function addUploadToList()
    {
    var oContainer = document.getElementById("uploadcontainer");
    var oCurrentInputDiv = document.getElementById("currentinput");
    var oSelect = document.getElementById('currentuploads');
    var oFileInput = document.getElementById('upload_' + n);
    var sFileName = oFileInput.value;

    // check if there is a maximum number of allowed uploads
    var i = oSelect.options.length;
    if (typeof arguments[0] != 'undefined' && i >= arguments[0])
    {
    alert(sFileUploadMaxReached);
    return false;
    }

    // check if file already exists in the upload list
    var bFileExists = false;
    while (i–)
    {
    if (sFileName == oSelect.options[i].text)
    {
    bFileExists = true;
    alert(sFileAlreadyExists);
    break;
    }
    }

    // remove input from form
    oFileInput = oCurrentInputDiv.removeChild(oFileInput);

    // add filename to selectbox and move the input to a hidden div
    // if the file is not already in the list
    if (!bFileExists)
    {
    var oOption = document.createElement("option");
    oOption.value = 'upload_' + n;
    oOption.innerText = sFileName;
    oSelect.appendChild(oOption);

    oContainer.appendChild(oFileInput);
    }

    // create a new file input
    n++;
    oFileInput = document.createElement("input");

    var oAttribute = document.createAttribute("name");
    oFileInput.setAttributeNode(oAttribute);

    oAttribute = document.createAttribute("id");
    oFileInput.setAttributeNode(oAttribute);

    oAttribute = document.createAttribute("type");
    oFileInput.setAttributeNode(oAttribute);

    oFileInput.setAttribute("name", "upload_" + n);
    oFileInput.setAttribute("id", "upload_" + n);
    oFileInput.setAttribute("type", "file");
    oFileInput.className = 'upload';

    oCurrentInputDiv.appendChild(oFileInput);
    return true;
    }
    </script>
    </head>

    <body>
    <h1>Multiple file upload</h1>

    <form action="upload.asp" method="post" enctype="multipart/form-data">

    <table border="0" cellpadding="0" cellspacing="0">
    <tr>
    <td valign="top">
    <div id="currentinput">
    <input type="file" class="upload" id="upload_1" name="upload_1" />
    </div>
    <div id="uploadcontainer"></div>
    </td>
    <td valign="top">
    <input type="button" onclick="addUploadToList()" value="Add To List" />
    </td>
    </tr>
    <tr>
    <td valign="top">
    <select id="currentuploads" name="currentuploads" multiple="multiple"></select>
    </td>
    <td valign="top">
    <input type="button" onclick="removeUploadsFromList()" value="Remove From List" />
    </td>
    </tr>
    </table>

    <input type="submit" value="Upload Files" />
    </form>
    </body>

    </html>
    [/code:1:8632162c99]


    p.s. de correcte vertaling voor 'toegestaan' in het Engels: allowed ;)
  • [quote:c10df514de="Annie"]Je overschrijft de superglobal $_FILES met waarden uit de $_POST, waarom is dat? Ik vermoed ook dat dat de reden is waarom je script fout loopt.

    [code:1:c10df514de]$_FILES['file_'.$i] = $_POST['file_'.$i];[/code:1:c10df514de]


    p.s. de correcte vertaling voor 'toegestaan' in het Engels: allowed ;)[/quote:c10df514de]

    hoi annie dank je wel voor je script en reactie!
    Ik probeerde van de volgende notice af te komen
    Notice: Undefined index: file_1 in

    maar dat doe ik dus niet goed als ik het ga overschrijven
    maar hoe kan ik het dan het beste oplossen ??
  • Je moet de $_FILES array in tact houden en op basis van de inhoud van die array je bewerkingen uitvoeren. De regel die ik heb gequote moet dus sowieso weg.

    Een loop door de $_FILES en per file je controles uitvoeren en opslaan of een melding geven, zou voldoende moeten zijn. Vergeet de $_POST voor de bestanduploads.
  • alleen, als ik die for-loop in stap 3 vervang met $_FILES , de quote weghaal en de rest van de code met rust laat:

    for ($i = 1; $i <= $_FILES['file_'.$i]; $i++)
    { }

    krijg ik die notice "Notice: Undefined index: file_1 in " juist weer en wordt er nix verzonden
  • bovenaan zetten:

    [code:1:25ebdd7fc4]var_dump($_FILES);[/code:1:25ebdd7fc4]

    weet je meteen wat voor vleesch je in de kuip hebt ;)
  • :-?
    vleesch van 0 dus

    array(0) { }

    ik zie door de bomen het bos niet meer :(
    zou iemand misschien met me mee kunnen kijken, dit is de code in z'n geheel ..
    :-?

    [code:1:47872d9559]<?
    error_reporting(E_ALL);

    ////////////////////////////////////////////////stap2 bestanden selecteren////////////
    if($_GET['action'])
    {

    if ($_POST)
    {
    //velden creeeren
    if(isset($_POST['files']))
    {
    if ($_POST['files'])
    {
    echo "<FORM METHOD=POST ACTION=index.php?page=" . $_GET['page'] . "&map=". $_GET['map'] . "&module=". $_GET['module'] . "&action=". $_GET['action'] . ">";
    //lijst creeeren
    for ($i = 1; $i <= $_POST['files']; $i++)
    {
    printf('<input type="file" name="file_%s" size="50"><br />', $i);
    }

    printf('<input class="knop" type="button" onclick="javascript: history.back(-1);" value="Annuleer">');

    printf('<input class="knop" type="submit" value="Upload documenten">');

    printf('<input type="hidden" name="history_files" value="%s">', $_POST['files']);

    printf('</form>');
    }
    }

    //////////////////////////////////////////stap 3 - bestanden uploaden/////////////////

    else
    {var_dump($_FILES);

    $upload_directory = $_SERVER['DOCUMENT_ROOT'] . "/dir/" . strtolower($smap["map"]);

    $file_exts = array('.txt','.csv');
    //upload bestanden

    printf('<b>Resultaat:</b><br><BR>');

    for ($i = 1; $i <= $_FILES['file_'.$i]; $i++)
    {

    $tmp_filename = $_FILES['file_'.$i]['tmp_name'];
    $filename = $_FILES['file_'.$i]['name'];

    printf('&nbsp;%s<BR>filename gelukt?', $tmp_filename);
    $file_ext = strtolower(substr($filename,strrpos($filename,".")));

    if (in_array($file_ext, $file_exts))
    {
    $status1 = "Juiste bestand";

    printf('&nbsp;%s<BR>', $status1);
    }

    if (!in_array($file_ext, $file_exts))
    {
    $status1 = "OnJuiste bestand";

    printf('&nbsp;%s<BR>', $status1);
    }
    $filename = "regels_".strtolower($smap["map"])."_";

    $n = 1;
    $path=$_SERVER['DOCUMENT_ROOT'] . "/dir/" . strtolower($smap["map"]) . '/';

    while (file_exists($path . $filename . $n . $file_ext))
    {
    $n=$n+1;
    }

    if (in_array($file_ext, $file_exts))
    {
    if(move_uploaded_file($tmp_filename, $upload_directory.'/'.$filename.$n.$file_ext))
    {
    $status2 = '<b> Het verzenden van dit document is goed verlopen..</b>';
    }
    else
    {
    $status3 = '<b> Het verzenden van dit document is slecht verlopen..</b>';
    }
    printf('&nbsp;%s<BR>%s<BR>', $status2, $status3);
    }
    else
    {
    $status4 = '<b> Het verzenden is mislukt: een lege veld is niet toegestaan. Alleen tekstbestanden zijn toegestaan.</b>';
    }
    if($filename=="")
    $filename="——";
    printf('&nbsp;%s<BR>%s<BR><br>', ($filename)?$filename.$n.$file_ext:'&nbsp;', $status4);
    }
    }
    }

    ///////////////////////////////////////stap 1 - aantal velden selecteren////////////////

    else
    {
    echo "<FORM METHOD=POST ACTION=index.php?page=" . $_GET['page'] . "&map=". $_GET['map'] . "&module=". $_GET['module'] . "&action=new>";
    printf('Aantal te verzenden bestanden : <br>');
    printf('<select name="files">');
    //creeer lijst met nummers
    for ($i = 1; $i <= 20; $i++)
    {
    printf('<option value="%1$s">%1$s', $i);
    }
    printf('</select> ');
    printf('<input type="submit" class="knop" value="Creëer velden">');
    printf('</form>');
    }
    }
    echo "</TD></TR>";
    ?>
    [/code:1:47872d9559]
  • Heb niet heel je script doorgelopen, maar zie wel dat je form een enctype="multipart/form-data" mist. Zonder die zal uploaden van bestanden sowieso niet werken.
  • echt heel suf dat ik dat niet zag :evil: … it's solved ! thk u VERY much!

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.