Foto uploaden en weergeven op bepaalde plaats in de website.

Status
Niet open voor verdere reacties.
Hiermee kan je verder. Er zit veel controle in.
Het is de aangepast www.php.net/manual/en/features.file-upload.php . Daar vind je meer info.
PHP:
<?php

// Geef het path, bijvoorbeeld "/map" of als "/map/submap"
$upload_path = $_SERVER["DOCUMENT_ROOT"] . "/uploads/afbeeldingen";
// max. file grootte in bytes
$max_filesize = 5000 * 1024;
// toegestane file extensies
$file_ext = array (
    'jpg' => 'image/jpeg',
    'png' => 'image/png',
    'gif' => 'image/gif',
);
// Benodigde variabele
$msg = "";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    try {
        
        //  Controleer op 'Corruptie Attack'
        if (!isset($_FILES['upfile']['error']) || is_array($_FILES['upfile']['error'])) {
            throw new RuntimeException("Onjuiste bestand parameters");
        }

        // Controleer $_FILES errors
        switch ($_FILES['upfile']['error']) {
            case UPLOAD_ERR_OK:
                break;
            case UPLOAD_ERR_NO_FILE:
                throw new RuntimeException("Geen bestand gevonden.");
            case UPLOAD_ERR_INI_SIZE:
            case UPLOAD_ERR_FORM_SIZE:
                throw new RuntimeException("Bestand groter dan limiet.");
            default:
                throw new RuntimeException("Onbekende fout opgetreden.");
        }

        // Controleer file grootte
        if ($_FILES['upfile']['size'] > $max_filesize) {
            throw new RuntimeException("Bestand is te groot.");
        }

        // Controleer MIME Type
        $finfo = new finfo(FILEINFO_MIME_TYPE);
        if (false === $ext = array_search (
            $finfo->file($_FILES['upfile']['tmp_name']), $file_ext, true
        )) {
            throw new RuntimeException("Onjuiste extensie.");
        }

        // Plaats file met unieke naam in map $path
        // Verander de volgende regel als je de echte naam wilt gebruiken
        $move_filename = sha1_file($_FILES['upfile']['tmp_name']);
        if (!move_uploaded_file( $_FILES['upfile']['tmp_name'],
            sprintf($upload_path . '/%s.%s', $move_filename, $ext)
        )) {
            throw new RuntimeException("Bestand kan niet verplaatst worden.");
        }

        // Hier is de upload gelukt
        $msg = "Bestand is met succes geupload.";
        
    // Hier is de upload niet gelukt
    } catch (RuntimeException $e) {
        $msg =  $e->getMessage();
    }
}

// Toon bericht
if ($msg != "") {
    $file_parts = explode(".", $_FILES['upfile']['name']);
    echo '<div id="message">';
    echo 'Het bestand <b>' . $_FILES['upfile']['name']    . '</b> is van type <b>' . $_FILES['upfile']['type'] . "</b>";
    echo '<br>Opgeslagen met bestandsnaam <b>' . $move_filename . "." . $file_parts[count($file_parts) - 1] . "</b>";
    echo '<br>De grootte is <b>' . $_FILES['upfile']['size'] . '</b> bytes.';
    echo '</div>';
}
?>
<div style="width:100%; max-width:350px; margin:15px auto; padding:15px; border:1px solid #ccc;">
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
        <br><b>Maximaal:</b> <?php echo round($max_filesize / 1024); ?> kb
        <br><b>Extensies:</b>&nbsp;
        <?php
        $ext_array = array_keys($file_ext);
        for ($i = 0; $i < count($file_ext); $i++ ) {
            echo $ext_array[$i] . "&nbsp;&nbsp;";
        }
        ?>
        <br><br><input type="file" name="upfile" size="40">
        <br><br><input type="submit" value="Upload">
    </form>
</div>
 
Ik lees het even door, beter is een beveiliging aan te maken en er voor te zorgen het uploaden moet doen waar die voor bedoeld is.

Later zou het uitgebreid worden door enkel gebruikers met rechten bij het uploaden erbij kunnen door hem in een verborgen map te zetten. (versleuteld)
Dat laatste lukt wel, maar richt me op het wijzigen van de foto met een online upload script zo gewijzigd wordt.

ik dacht het is best simpel, maar komt stiekem veel bij kijken.
Helaas zal ik er vandaag niet veel mee kunnen doen, maar ga zeker eens verdiepen in de uitbreidingen van het script en dan eens een uitvoerige pagina maken om te testen.

Opgeven zal ik zeker niet doen, ik heb gewoon niet voldoende ervaring in dit soort scripts.
html5 & css3 heb ik goed onder de knie...

Adem in & uit......... i come back! :cool:


(tnx tot zover voor jullie tijd & hulp!!!!)

edit: plaatje als test plaatje toegevoegd: piet.jpg (piet.jpg)
 
Laatst bewerkt:
Ik lees het even door, beter is een beveiliging aan te maken en er voor te zorgen het uploaden moet doen waar die voor bedoeld is.
Ik heb jouw formulier en jouw gegevens uit bericht #1 gebruikt.
Alleen deze is beter beveiligd en heeft meer controles op gebruikersfouten.

Later zou het uitgebreid worden door enkel gebruikers met rechten bij het uploaden erbij kunnen door hem in een verborgen map te zetten.
De eenvoudigste manier is het gebruik van .htaccess + .htpasswd (simpel, goed beveiligd, vormgeving is niet aan te passen)
Een generator met uitleg vind je op www.transip.nl/htpasswd/

Adem in & uit :D
 
Laatst bewerkt:
De eenvoudigste manier is het gebruik van .htaccess + .htpasswd (simpel, goed beveiligd, vormgeving is niet aan te passen)

Dit gedeelte lukt me wel, maar heb het even nu actief staan zonder login anders kunnen we niet gezamenlijk testen :p
 
Wat is de bedoeling? Dat de foto's pas bekeken mogen worden als je ingelogd bent / juiste rechten hebt?
En niet zomaar door anderen bekeken/geïndexeerd mogen worden?
 
Aanvulling: je mag in .htpasswd op elke regel een gebruiker/wachtwoord zetten :) :)
 
Beste helpers

bericht #21 wel toegepast en bezig geweest, maar enige ik zie is het plaatje is toegevoegd en weet wat "Aar" bedoeld met meer informatie het plaatje suc6 is geüpload. Het zou idd verder uitgebreid kunnen worden tot naar wens.

Wat ik gewoon niet snap is het plaatje is geüpload, maar kan hem nergens vinden waar die is geüpload.
geüpload in wat? waar naar toe?
is het gewoon een file op onze systeem?
ik dacht uploaden = er is een url naar de file toe. (upload pad)

Bedoeling is als volgt:

1* ingelogde gebruikers kunnen hun eigen foto wijzigen, deze moet aan wat voorwaarde voldoen, anders is de foto niet juist online.
* dat inlog systeem met .httacess is echt totaal geen probleem voor mij en dat lukt.
* de foto komt op hun eigen profiel te staan, ieder ziet een soort gelijke profiel, met een eigen foto de zelf kunnen wijzigen.
* de gebruiker klikt dus op wijzig foto >> upload foto (vanuit hun verkenner) en klikt erna op uploaden.

tot zover lukt het wel en zijn we #27 berichten verder zonder enige hulp in me vraag, hoe kan ik die foto terug vinden?
dat frustreert me zo erg ik al weken bezig ben en het niet wil lukken om de url op te vragen van die foto.
De huidige foto (zie 1*) toont al wel een foto en kan ik met een url ernaar toe opvragen, deze foto zit in een map "afbeeldingen" en linkt er ook heen.
Nu moet hij gewijzigd worden met het upload programma, en dat koppelen aan deze profiel foto.

Simpel is het niet want ik snap er nog steeds niets van waarom die foto dan niet wijzigt, ik upload hem toch heel duidelijk.

Ik wou al opgeven, wordt er gek van... ik wil geen topic van 300 pagina's. had Aar al pb gedaan wat de reden precies is, die kijkt hem niet na denk :d

al met al.. ik heb dus een begin van eerst de upload goed op te zetten, beter te beveiligen en zorgen de juiste melding in beeld komt.
ik zal dit eens volledig in orde moeten maken, maar komende dagen enorm druk.

ik kom er eens op terug en dan zorg ik een test account aan maakt, en we eens kunnen zien wat er mis gaat of waar ik blijf plakken.
(hoewel als ik op "uploaden" klikt moet de foto zichtbaar komen)

we gaan door tot het uiterste. tnx voor jullie hulp, geduld en begrip!
 
Wat ik gewoon niet snap is het plaatje is geüpload, maar kan hem nergens vinden waar die is geüpload.
geüpload in wat? waar naar toe?
is het gewoon een file op onze systeem?
Heb je een map "uploads" met daarin een map "afbeeldingen" gemaakt op de webserver? (zie de php bovenaan)
PHP:
$upload_path = $_SERVER["DOCUMENT_ROOT"] . "/uploads/afbeeldingen";
ik dacht uploaden = er is een url naar de file toe.
Klopt, de url is dan https://www.example.nl/uploads/afbeeldingen/_______.jpg

Ergens in een vorig berichtje had je het over private_html. Om een foto in de browser zichtbaar te maken moeten ze in public_html.

* de foto komt op hun eigen profiel te staan, ieder ziet een soort gelijke profiel, met een eigen foto de zelf kunnen wijzigen.
* de gebruiker klikt dus op wijzig foto >> upload foto (vanuit hun verkenner) en klikt erna op uploaden.
Om eerlijk te zijn, dit is geen 1-2-3'tje om hier in berichtjes werkende te krijgen. Dit vraagt veel meer dan een upload scriptje.

Vraagje: "vanuit hun verkenner" bedoel je daarmee de Windows Verkenner of de browser?
 
Laatst bewerkt:
Heb je een map "uploads" met daarin een map "afbeeldingen" gemaakt op de webserver? (zie de php bovenaan)

Kan zo niet slapen..
Dit eens gedaan en verhipt.... de url werkt! https://www.melodyexpress.nl/uploads/afbeeldingen/0cda27f512e4c21f6efe925bfd5f6e64b85a48ef.jpg

De afbeelding is daar, afbeelding is even niet relevant, maar nu wil ik een ander plaatje uploaden en dan is mijn url weer anders.
Dat is t probleem, die url moet automatisch gewijzigd worden waar de foto staat, maar nu heb ik elke keer een map vol geüploade plaatjes en steeds een ander url:o

nu moet ik nog steeds handmatig de juiste url naar de foto opgeven.
 
Laatst bewerkt:
Heb je een map "uploads" met daarin een map "afbeeldingen" gemaakt op de webserver? (zie de php bovenaan)
nee, ik kan dit wel eens doen van de week
Dit is wel nodig :D
$upload_path = $_SERVER["DOCUMENT_ROOT"] . "/uploads/afbeeldingen";
maar dit plaats ik in de upload script erbij?
Dit staat al in het script.
windows verkenner (dus een foto op je pc)
Helaas, dan gaat het niet lukken. Je kan met html/php alleen uploaden via de browser.
Je kan wel in de browser op de upload knop klikken en dan de foto van de computer halen.
 
Laatst bewerkt:
Helaas, dan gaat het niet lukken. Je kan met html/php alleen uploaden via de browser.

berichten elkaar gekruist :D
Maar ja bedoelde u zo, ja via de url browser een foto uploaden.
Zodra ik op uploaden klikt opent me windows verkenner, daar pak ik de foto en is het een ander url adres per foto ik dus upload.
 
Beste helpers
ik dacht uploaden = er is een url naar de file toe. (upload pad)

Uiteraard is er een pad nodig. PHP bepaalt niet of dit in /afbeeldingen, /fotos of /afbeeldingen/pietje komt te staan.
Een deel van de URL bevat dus het pad.

Je hebt het over /private_html en /public_html.
Bij DirectAdmin, wat je al hostingpanel lijkt te gebruiken, wordt private_html standaard gebruikt voor websites die bereikbaar zijn via SSL, en public_html voor de niet-SSL sites.
Maar het leuke is dat je bij de Domain settings een knop hebt waarmee je beide webroots kan samenvoegen tot public_html.

En ja, de keuze voor de naam private_html voor SSL is erg vreemd. Oude foute beslissing van John van DirectAdmin, vermoed ik. Maar het is zo ingeburgerd dat /secured_html het verwarrender maakt.
 
Laatst bewerkt:
Het enige wat ik nog kan doen is de inlog in de php zetten.
Als de foto "gezicht.jpg" heet en de gebruiker die inlogt "piet" heet, dan heet het bestand: piet-gezicht.jpg
Vervang alles door het onderstaande. En zorg voor een .htaccess + .htpasswd bestand.
PHP:
<?php

// Geef het path, bijvoorbeeld "/afbeeldingen" of "/uploads/afbeeldingen"
$upload_path = $_SERVER["DOCUMENT_ROOT"] . "/uploads/afbeeldingen";
// max. file grootte in bytes
$max_filesize = 5000 * 1024;
// toegestane file extensies
$file_ext = array (
    'jpg' => 'image/jpeg',
    'png' => 'image/png',
    'gif' => 'image/gif',
);
// Benodigde variabele
$msg = "";
$move_filename = "";
$loggedIn = false;

try {

    // Controleer of gebruiker is ingelogd via htpasswd
    if ( isset($_SERVER["REMOTE_USER"]) && !empty(trim($_SERVER["REMOTE_USER"])) ) {
        $loggedIn = true;
    } else {
        throw new RuntimeException("U bent niet ingelogd.");
    }

    if ($loggedIn === true && $_SERVER['REQUEST_METHOD'] == 'POST') {

        //  Controleer op 'Corruptie Attack'
        if (!isset($_FILES['upfile']['error']) || is_array($_FILES['upfile']['error'])) {
            throw new RuntimeException("Onjuiste bestand parameters");
        }

        // Controleer $_FILES errors
        switch ($_FILES['upfile']['error']) {
            case UPLOAD_ERR_OK:
                break;
            case UPLOAD_ERR_NO_FILE:
                throw new RuntimeException("Geen bestand gevonden.");
            case UPLOAD_ERR_INI_SIZE:
            case UPLOAD_ERR_FORM_SIZE:
                throw new RuntimeException("Bestand groter dan limiet.");
            default:
                throw new RuntimeException("Onbekende fout opgetreden.");
        }

        // Controleer file grootte
        if ($_FILES['upfile']['size'] > $max_filesize) {
            throw new RuntimeException("Bestand is te groot.");
        }

        // Controleer MIME Type
        $finfo = new finfo(FILEINFO_MIME_TYPE);
        if (false === $ext = array_search (
            $finfo->file($_FILES['upfile']['tmp_name']), $file_ext, true
        )) {
            throw new RuntimeException("Onjuiste extensie.");
        }

        // Plaats foto in map $path. Bestaande foto's worden overschreven!
        $path_parts = pathinfo($_FILES['upfile']['name']);
        $move_filename = $_SERVER["REMOTE_USER"] . "-" . $path_parts['filename'];
        if (!move_uploaded_file( $_FILES['upfile']['tmp_name'],
            sprintf($upload_path . '/%s.%s', $move_filename, $ext)
        )) {
            throw new RuntimeException("Bestand kan niet verplaatst worden.");
        }

        // Hier is de upload gelukt
        $msg = "Bestand is met succes geupload.";
    }

// Hier is de upload niet gelukt
} catch (RuntimeException $e) {
    $msg =  $e->getMessage();
}

// Toon bericht
if ($loggedIn === true && $msg != "") {
    echo '<div id="message">';
    echo 'Het bestand <b>' . $_FILES['upfile']['name'] . '</b> is van type <b>' . $_FILES['upfile']['type'] . "</b>";
    echo '<br>Opgeslagen met bestandsnaam <b>' . $move_filename . "." . $ext . "</b>";
    echo '<br>De grootte is <b>' . $_FILES['upfile']['size'] . '</b> bytes.';
    echo '</div>';
}
?>

<div style="width:100%; max-width:350px; margin:15px auto; padding:15px; border:1px solid #ccc;">
    <?php
    if ( isset($_SERVER["REMOTE_USER"]) && !empty(trim($_SERVER["REMOTE_USER"])) ) {
        echo '<div style="padding:10px 0;">Welkom bezoeker: ' . $_SERVER["REMOTE_USER"] . '</div>';
    }
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
        <br><b>Maximaal:</b> <?php echo round($max_filesize / 1024); ?> kb
        <br><b>Extensies:</b>&nbsp;
        <?php
        $ext_array = array_keys($file_ext);
        for ($i = 0; $i < count($file_ext); $i++ ) {
            echo $ext_array[$i] . "&nbsp;&nbsp;";
        }
        ?>
        <br><br><input type="file" name="upfile" size="40">
        <br><br><input type="submit" value="Upload">
    </form>
</div>

Inloggen via htpasswd is veilig én niet veilig. Veilig omdat de webserver een 403 Forbidden stuurt als niet juist is ingelogd. Niet veilig omdat iedereen van een inlog gebruik kan maken totdat ALLE browser vensters zijn gesloten.
 
Laatst bewerkt:
En los van .htaccess is het een hele toer om geautomatiseerd je bestand met de inlog-credentials aan te passen.
Dus als iemand zijn password heeft lopen lekken, dan wil je toch graag een mogelijkheid hebben om dit snel te kunnen doen. Ook al ben je op vakantie.
 
Wie zou ik via een prive bericht in vertrouwen iets kunnen vragen/doorgeven om dit gesprek voort te zetten?
Want hier op een openbare forum gaat dit niet.

Alvorens bedankt!
 
Met welke reden zou dit via privé bericht moeten? ;)
Vergeet niet dat dit een forum is die andere ook als knowledgebase kunnen gebruiken.

Er zijn vaak legio uitwegen om dit openbaar te doen, maar dat hangt wel van de reden af.
Ik neem aan dat we hier geen wachtwoorden of gebruikersnamen hoeven te plaatsen.

Bovendien heeft een authenticatie niet echt veel meer te maken met uploaden van foto's.
Dus eigenlijk zijn vervolgvragen hierover een nieuw topic waard.
 
Laatst bewerkt:
Ik zie geen privébericht van je?
Maar de reden kan je wel opnoemen hier. Dan valt er altijd wel een mouw aan te passen.
Misschien wat beperkte (pseudo) code, of wat tekst anonimiseren of een naam achterwege laten....

Edit:
PB ontvangen, maar in mijn ogen kan dit prima in een topic.

En om terug te komen op je probleem hierover:
Een foto wijzigen is niets anders dan de foto weer op te slaan onder dezelfde naam zoals die opgeslagen is. Er is geen mechanisme in PHP die dit zou moeten verhinderen.
Hoe je een foto kan uploaden is inmiddels wel uit de doeken hier gedaan.

Als het om beveiligen van dit systeem gaan, met authenticatie voor leden. Dan is dat een nieuw topic waard.
 
Laatst bewerkt:
En los van .htaccess is het een hele toer om geautomatiseerd je bestand met de inlog-credentials aan te passen.
Dus als iemand zijn password heeft lopen lekken, dan wil je toch graag een mogelijkheid hebben om dit snel te kunnen doen. Ook al ben je op vakantie.
Dit kan met een apart php scriptje maar zitten we ondertussen niet een (kleine) cms backend te bouwen :confused:

Als een applicatie zo groot wordt dat dit niet in een forum past (daar begint het op te lijken) dan wordt het eigenlijk een applicatie die gebouwd moet worden door derden. De wensen zijn nog te vaag en die moeten zorgvuldig met de bouwer worden besproken. Ook moeten mogelijke toekomstige uitbreidingen worden besproken, als dit niet wordt gedaan dan kunnen sommige wensen in de toekomst een hoop werk met zich meebrengen.
 
Laatst bewerkt:
Een PHP-scriptje kan je wel maken, om alles uit te lezen, toe te voegen of te wijzigen en daarna terug te plaatsen.
Maar in zo'n geval kan je beter gebruik maken van een mooie oplossing met een apart inlogscherm in HTML en een opslag van de gebruikers in een database.
Er is vaak meer dan een username en password wat je wilt opslaan.

.htaccess is leuk voor het 'even', maar ik zie dit niet echt als een robuust en flexibel inlogsysteem.

Een beetje inlogsysteem gebruikt:
- Uitgebreid beheer van alle gebruikers
- Beheer van eigen wachtwoord
- Uitsluiten van een gebruiker (bannen)
- Bijhouden van laatste inlog
- Bijhouden van aantal foute logins in bepaalde tijd (brute-force)
- Opslaan van wachtwoord op veilige manier in een hash.
- Op veilige manier wachtwoord resetten.

Extra, maar wat niet verplicht is:
- Rechtensysteem voor moderators, admins etc...
- 2 staps verificatie. (2FA)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan