Frage von Minding, 20

PHP Bild hochladen und abspeichern

Hallo Community,

ich will eine Seite (HTML,PHP, MySQLi, CSS - möglichst kein JS) machen, wo man sein Bild hochlädt und es dann gespeichert wird, während der Pfad in der DB landet.

Mein Code bis jetzt:

HTML:

<br /><h3><?php echo $language['reportTitle']; ?></h3>
        <form class="adder" action="saveReport.php" method="POST" enctype="multipart/form-data">
            <input type="hidden" name="ID" value="<?php echo $_SESSION['ID']; ?>" />
            <br /><?php echo $language['reportImage']; ?><label class="upload"><p><?php echo $language['reportUpload']; ?></p><input name="image" type="file" maxlength="1000000" accept="image/*" /></label>
            <br /><br /><?php echo $language['reportDescription']; ?><input name="description" type="text" />
            <br /><br /><b><?php echo $language['reportInfoTitleGeneral']; ?></b><input type="submit" />
        </form>

CSS: (eig. unwichtig)

.upload {
    overflow: hidden;
    position: absolute;
    text-align: center;
    font-size: small;
    color: #708090;
    background-color: #dddddd;
    width: 213px;
    height: 33px;
    left: 500px;
    margin-top: -10px;
    border-width: thin;
    border-color: #C0C0C0;
    border-style: solid;
    border-radius: 3px;
}
.upload:hover {
    border-color: #008B8B;
}
.upload [type="file"] {
    display: block;
    position: absolute;
    font-size: 999px;
    filter: alpha(opacity=0);
    opacity: 0;
    right: 0;
    top: 0;
}
.upload p {
    margin-top: 10px;
}

PHP: (nur ein Ansatz)

<?php
    include('../include/language.inc.php');
    include('../include/testSession.inc.php');
    include('../include/connect.inc.php');
    
    $info[1] = $_POST['ID'];
    $info[2] = $_POST['description'];
    $info[3] = $_FILES['image'];
    $size = sizeof($info);
    for($i = 0; $i < $size; $i++) {
        if(empty($info[$i])) {
            $_SESSION['error'] = $language['addErrorMissingData'];
            header('Location:report.php');
            die($language['addErrorMissingData']);
        }
    }
    $path = "INSERT INTO bugs VALUES (NULL,'".$info[1]."','".$info[2]."','".$info[3]."')";
    $mysqli->query($path);
    imagepng($im, '../include/images/'. $mysqli->insert_id . image_type_to_extension(IMAGETYPE_PNG));
?>

Ich habe schon ein bisschen gegoogelt, aber ich versteh's nicht. Gefunden hab ich:

Am ende sollen (NULL für die ID), die UserID und die Beschreibung in der DB landen. Der Bild-Pfad soll bug['ID'].'.png' sein.

Fragen:

  • Wie nehme ich das Bild entgegen? ($_POST oder $_FILES)
  • Wie wandle ich das Bild in ein PNG-Format um?
  • Wie speicher ich das Bild?
  • Wieso spackt der "Hochladen"-Button so? (Text verschwindet nach anklicken) (Optional)

Danke, schon mal im Voraus!

-Minding

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von FaronWeissAlles, 19

Hey (Frage gerade erst gesehn),

Du hast ja scheinbar rausgefunden wie du die Datei entgegennimmst und speichern kannst (move uploaded file). Sehr gut.

Zu deinen restlichen Fragen:

Wie ändere ich die Endung?

Du willst ein beliebiges Bild, das hochgeladen wurde ins PNG-Format formatieren? Dazu gibts die Funktion imagepng():

$result = imagepng(imagecreatefromstring(file_get_contents($filename)), "dein/zielpfad/datei.png");

Einfach die hochgeladene Datei damit konvertieren.

Können manche Bildformate mehr als PNG oder werden sie vlt. bei der Formatierung beschädigt (kein .gif oder so)

Wenn Bild-Dateien in ihrer Struktur beschädigt sind kann es natürlich sein, dass das konvertieren fehlschlägt (oder wenn etwas anderes als ein Bild hochgeladen wurde). In diesem Fall weißt du Bescheid, indem du den Rückgabewert von imagepng untersuchst. Wenn $result false ist, würde kein gültiges Bild hochgeladen. Bedenke, dass das Ändern der Dateiendung keine Konvertierung ist! Du hast dann immer noch ein JPG oder GIF, dessen Dateiname dann lediglich mit ".png" endet

Wieso spackt der "Hochladen"-Button so? (Text verschwindet nach anklicken) (Optional)

Soweit ich dein CSS und HTML gesehen habe hast du kein entsprechendes Verhalten definiert. Ich vermute daher, dass der Schuldige der Browser ist, der den Text ändert/löscht, nachdem er mit dem Senden begonnen hat (um den User daran zu hindern während des Sendevorgangs erneut eine Datei auszuwählen). Schau doch mal ob ein anderer Browser genauso reagiert (IE, Firefox, Chrome)

Kommentar von Minding ,

Hi,

danke für deine Antwort!

Ich hab's jetzt mit Opera, Chrome, FF und IE ausprobiert - überall das gleiche Problem!

Ich hoffe mir kann jemand Helfen, ich nehm auch gerne andere CSS Vorschläge an und passe sie dann meinem Design an.

-Minding

Antwort
von Minding, 14

Hi,

kleines Update:

PHP:

<?php
    include('../include/language.inc.php');
    include('../include/testSession.inc.php');
    include('../include/connect.inc.php');

    $image = $_FILES['image'];
    if(empty($_POST['ID']) || empty($_POST['description'])) {
        $_SESSION['error'] = $language['addErrorMissingData'];
        header('Location:report.php');
        die($language['addErrorMissingData']);
    }
    $path = "INSERT INTO bugs VALUES (NULL,'".$_POST['ID']."','".$_POST['description']."')";
    $mysqli->query($path)or die($mysqli->error);
    //Format in PNG ändern (bevorzugt) oder Datei-Endung in der DB speichern
    //Image unter dem Namen $mysqli->insert_id.png speichern
?>

Und zu dem CSS Problem das Bild:

-Minding

Kommentar von Minding ,

Hi,

ich hab's mal wieder selbst gemacht und schreibe hier anscheinend nur mit mir selbst.
Nach einer langen Suche hab ich das hier gefunden:

move_uploaded_file($image['tmp_name'], $imagePath . $mysqli->insert_id . substr($image['name'], -4));

Jedoch will ich die Datei lieber als .png speichern.

Fragen:

  • Können manche Bildformate mehr als PNG oder werden sie vlt. bei der Formatierung beschädigt (kein .gif oder so)
  • Wie ändere ich die Endung?
  • Immer noch das kleine CSS Problem.

BITTE Antwortet mal jemand in diesem ##### ("gutem") Forum!!! :( (Oder schlägt ein besseres vor :D)

-Minding

Kommentar von Minding ,

Hi,

ich schreibe immer noch mit mir selbst und zu meinen bisherigen Fragen:

1.) Die Bilder werden nicht beschädigt

2.) SO:

move_uploaded_file($image['tmp_name'], $imagePath . $mysqli->insert_id . '.png');

3.) Ungelöst!

Also die letzte Frage:

Wieso spackt der "Hochladen"-Button so?

-Minding

Keine passende Antwort gefunden?

Fragen Sie die Community