À l'aide de PHP à télécharger des images vers un dossier, tout en économisant de descriptions à une base de données
L'utilisateur décide de télécharger des images multiples pour leurs petites inscription. Ce que j'ai besoin d'avoir lieu est de:
- Télécharger les images avec des descriptions pour chacune des images - RÉSOLUTION
- Enregistrer les images dans un dossier spécifié
- Enregistrer l'emplacement de l'image à ma base de données MySQL avec les descriptions RÉSOLU
- Être en mesure d'appeler les images et les descriptions dans leur liste classée dans le genre de l'environnement de la galerie
Mon schéma de la table est mis en place comme ceci (simplifié):
ad_id | member_id | category | subcategory | ... | photo_0_href | photo_0_desc ... | etc.
Quelqu'un pourrait-il me guider à travers le processus? Merci.
step3.php
<form action="upload.php" method="post" enctype="multipart/form-data">
<p>
<label for="file0">Filename: </label>
<input name="file[]" type="file" id="file0" size="20" />
</p>
<p>
<label for="file0desc">Description: </label>
<textarea rows="10" cols="30" id="file0desc" class="textarea"></textarea>
</p>
<p>
<label for="file1">Filename: </label>
<input name="file[]" type="file" id="file1" size="20" />
</p>
<p>
<label for="file1desc">Description: </label>
<textarea rows="10" cols="30" id="file1desc" class="textarea"></textarea>
</p>
<p>
<input id="submit" type="submit" name="submit" value="Continue to Step 4" />
</p>
</form>
upload.php
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 1048600)) //less than 1MB
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
header("Location: step4.php");
/*
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] /1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
*/
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
Je sais que mon upload.php n'est pas configuré pour de multiples fichiers d'image, mais c'est un début.
J'ai travaillé à sauver les descriptions de la base de données à l'aide de $_SESSION['file_n_desc']
. J'ai juste besoin de comprendre comment télécharger de la reprise des images dans le dossier et ensuite enregistrer les emplacements dans la base de données.
J'ai aussi besoin d'avoir l'image renommé à une chaîne de caractères aléatoires (pour éviter que les images soient remplacées). Je sais que je peux le faire avec le rand()
fonction.
- Quelle partie vous avez des problèmes avec? De charger/Sauver, mysql, quelque chose d'autre?
- Vous avez à peu près le processus en 4 étapes, charger - enregistrer, ajouter l'image d'infos à mysql, sélectionnez les images dont la cotation est bof. Quel code que vous avez déjà?
- Matthews: je peux télécharger les images dans le dossier, mais je vais avoir quelques maux de tête à sauver les photos et les descriptions.
- Hatting - s'il vous plaît partager le code que vous avez déjà pour savoir où commencer à aider, sinon, ma conjecture est que vous êtes trop nombreux processus et, éventuellement, dans le mauvais ordre, c'est l'arrêt de l'image nom/id de l'être liées à des données dans la base de données mais ce n'est qu'une supposition car je ne vois pas votre code
- Édité ma question d'origine avec le code de l'extrémité avant et le processeur de fichiers.
- Une autre chose: j'ai besoin d'avoir l'image renommé à une chaîne de caractères aléatoires (pour éviter que les images soient remplacées). Je sais que je peux le faire avec la fonction rand (), mais j'ai oublié de le mentionner dans mon post original.
- où est la boucle dans laquelle vous gérez chaque fichier téléchargé ?
Vous devez vous connecter pour publier un commentaire.
1), le Téléchargement de fichiers
Lors de l'utilisation de la syntaxe de tableau de fichier intrants, le fichier d'index est la dernière touche.
$_FILES["file"]["name"]
, par exemple, est un tableau de noms de fichiers. Pour obtenir les informations pour la i-ème de fichier, vous aurez besoin d'accéder à$_FILES["file"]["name"][$i]
,$_FILES["file"]["size"][$i]
&c.2) enregistrer des Images dans un Dossier
Certaines données
$_FILES
(telles que le nom) provient du client, et n'est donc pas à être digne de confiance (qui est, de vérifier en premier). Dans le cas de la nom de fichier, vous pourriez commencer par l'aide derealpath
pour vérifier le fichier cible pathname est sûre, ou de l'utilisationbasename
oupathinfo
pour extraire la dernière composante de la fourniture de nom avant d'assembler le chemin d'accès cible.3) Enregistrement d'image info DB
L' (incomplet) schéma de base de données vous donner dirait que vous donnez à chaque image deux colonnes d'une même table. En vertu du modèle relationnel, à de nombreuses relations sont modélisés avec une table séparée:
Sinon, vous êtes briser le zéro-un-l'infini la règle et le gaspillage de l'espace quand il y a de moins que le nombre maximum d'images.
Autres
Notez que vous pouvez utiliser la syntaxe de tableau pour le fichier de description des champs pour rendre le traitement plus facile. Leur nom de "filedesc[]".
Plutôt qu'une longue suite de comparaisons, utiliser un tableau de recherche ou d'un motif.
Le type de fichier est l'un de ces client des valeurs fournies. Plus sûr serait d'utiliser
fileinfo
pour obtenir le type d'image.Même ce qui peut être dupe si le fichier est valide en-tête d'image mais le reste n'est pas valide. Vous pouvez utiliser un l'image de la bibliothèque (comme GD ou ImageMagick) pour valider le fichier en vérifiant si vous pouvez ouvrir le fichier en tant qu'image.
Pas sûr de ce que les erreurs que vous rencontrez, que vous semblez avoir le processus assez clair dans votre tête. La première fois que je faisais cela, j'ai utilisé ce tutoriel comme un guide et tout a fonctionné parfaitement: http://php.about.com/od/phpwithmysql/ss/Upload_file_sql.htm
Pourrais-je vous suggérer de conserver le fichier dans la base de données à la place?? Moins de problèmes de sécurité chemin!
P. S: j'ai eu le sentiment que vous êtes un débutant et je pense que j'ai fait une belle liste à Les Débutants en PHP: Comment écrire du bon code
move-uploaded-file devrait fonctionner. Ce qui vient à l'esprit est que vous n'avez pas le droit d'écrire des autorisations pour déplacer des fichiers. Quel type de serveur que vous utilisez(Linux/Windows/MacOSX)? Quel est le retour de la fonction en tant que booléen(suite)?
rand()
n'est pas vraiment aléatoire et pourrait donner des noms de fichiers doublons. uniqid sera uniqueLors de l'utilisation de session lorsque vous n'avez pas remplacé session vous n'êtes pas à l'aide de votre base de données MySQL mais le système de fichiers.. Vous pouvez lire ce tutoriel à pour magasin de session dans une base de données. Standard cette session obtient purgés lors de la fermeture du navigateur(juste pour cette session). Juste essayer ce code:
De charger cette page quelques reprises, sans fermer votre navigateur. Vous obtiendrez quelque chose qui ressemble à:
0
rlu10shi6l390il130qinlt913
1
rlu10shi6l390il130qinlt913
Mais lorsque vous fermez le navigateur que session_id a changé et que votre compteur est remis à zéro et vous obtenez un résultat qui ressemble.
J'ai utilisé AOP(Bonne Lecture) à faire (My)SQL. Je n'ai unité-les tests(TDD) à l'aide de phpunit. Pour accéder à la base de données j'ai utilisé SQLite en mode mémoire(très agréable à faire, SQL-test) =>
new PDO('sqlite::memory:');
. J'ai essayé de suivre Oncle Bob trois règles(Bonne Lecture).Normalement, vous divisez ce dans plusieurs fichiers. Chaque classe dans un fichier séparé. Chaque classe devrait être testé en Isolation(couplage faible) dans un fichier séparé.
J'ai utilisé clé étrangère à la carte "dans la Liste à l'Image". Je pense que cet exemple est testé très bien, mais pour l'instant il est vraiment temps pour moi de dormir un peu, donc je ne suis pas sûr ;).