Je fais une validation de formulaire pour m'assurer que le fichier téléchargé par un utilisateur est du bon type. Mais le téléchargement est facultatif, donc je veux ignorer la validation s'il n'a rien téléchargé et a soumis le reste du formulaire. Comment puis-je vérifier s'il a téléchargé quelque chose ou non? Volonté $_FILES['myflie']['size'] <=0
travail?
Vous pouvez utiliser is_uploaded_file()
:
if(!file_exists($_FILES['myfile']['tmp_name']) || !is_uploaded_file($_FILES['myfile']['tmp_name'])) {
echo 'No upload';
}
De la documentation:
Renvoie VRAI si le fichier nommé par nom de fichier a été téléchargé via HTTP POST. Ceci est utile pour vous assurer qu'un utilisateur malveillant n'a pas essayé de tromper le script pour qu'il travaille sur des fichiers sur lesquels il ne devrait pas fonctionner - par exemple,/etc/passwd.
Ce type de vérification est particulièrement important s'il y a une chance que tout ce qui est fait avec des fichiers téléchargés puisse révéler leur contenu à l'utilisateur, ou même à d'autres utilisateurs sur le même système.
EDIT: J'utilise ceci dans ma classe FileUpload, au cas où cela aiderait:
public function fileUploaded()
{
if(empty($_FILES)) {
return false;
}
$this->file = $_FILES[$this->formField];
if(!file_exists($this->file['tmp_name']) || !is_uploaded_file($this->file['tmp_name'])){
$this->errors['FileNotExists'] = true;
return false;
}
return true;
}
Ce code a fonctionné pour moi. J'utilise plusieurs téléchargements de fichiers, je devais donc vérifier s'il y avait eu un téléchargement.
Partie HTML:
<input name="files[]" type="file" multiple="multiple" />
Partie PHP:
if(isset($_FILES['files']) ){
foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
if(!empty($_FILES['files']['tmp_name'][$key])){
// things you want to do
}
}
@ karim79 a la bonne réponse, mais j'ai dû réécrire son exemple en fonction de mes objectifs. Son exemple suppose que le nom du champ soumis est connu et peut être codé en dur. J'ai pris un peu plus loin et créé une fonction qui me dira si des fichiers ont été téléchargés sans avoir à connaître le nom du champ de téléchargement.
/**
* Tests all upload fields to determine whether any files were submitted.
*
* @return boolean
*/
function files_uploaded() {
// bail if there were no upload forms
if(empty($_FILES))
return false;
// check for uploaded files
$files = $_FILES['files']['tmp_name'];
foreach( $files as $field_title => $temp_name ){
if( !empty($temp_name) && is_uploaded_file( $temp_name )){
// found one!
return true;
}
}
// return false if no files were found
return false;
}
<!DOCTYPE html>
<html>
<body>
<form action="#" method="post" enctype="multipart/form-data">
Select image to upload:
<input name="my_files[]" type="file" multiple="multiple" />
<input type="submit" value="Upload Image" name="submit">
</form>
<?php
if (isset($_FILES['my_files']))
{
$myFile = $_FILES['my_files'];
$fileCount = count($myFile["name"]);
for ($i = 0; $i <$fileCount; $i++)
{
$error = $myFile["error"][$i];
if ($error == '4') // error 4 is for "no file selected"
{
echo "no file selected";
}
else
{
$name = $myFile["name"][$i];
echo $name;
echo "<br>";
$temporary_file = $myFile["tmp_name"][$i];
echo $temporary_file;
echo "<br>";
$type = $myFile["type"][$i];
echo $type;
echo "<br>";
$size = $myFile["size"][$i];
echo $size;
echo "<br>";
$target_path = "uploads/$name"; //first make a folder named "uploads" where you will upload files
if(move_uploaded_file($temporary_file,$target_path))
{
echo " uploaded";
echo "<br>";
echo "<br>";
}
else
{
echo "no upload ";
}
}
}
}
?>
</body>
</html>
Mais soyez vigilant. L'utilisateur peut télécharger n'importe quel type de fichier et peut également pirater votre serveur ou votre système en téléchargeant un fichier malveillant ou php. Dans ce script, il devrait y avoir des validations. Merci.
J'ai vérifié votre code et je pense que vous devriez essayer ceci:
if(!file_exists($_FILES['fileupload']['tmp_name']) || !is_uploaded_file($_FILES['fileupload']['tmp_name']))
{
echo 'No upload';
}
else
echo 'upload';
Tu devrais utiliser $_FILES[$form_name]['error']
. Il renvoie UPLOAD_ERR_NO_FILE
si aucun fichier n'a été téléchargé. Liste complète: PHP: Explication des messages d'erreur
function isUploadOkay($form_name, &$error_message) {
if (!isset($_FILES[$form_name])) {
$error_message = "No file upload with name '$form_name' in form.";
return false;
}
$error = $_FILES[$form_name]['error'];
// List at: http://php.net/manual/en/features.file-upload.errors.php
if ($error != UPLOAD_ERR_OK) {
switch ($error) {
case UPLOAD_ERR_INI_SIZE:
$error_message = 'The uploaded file exceeds the upload_max_filesize directive in php.ini.';
break;
case UPLOAD_ERR_FORM_SIZE:
$error_message = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.';
break;
case UPLOAD_ERR_PARTIAL:
$error_message = 'The uploaded file was only partially uploaded.';
break;
case UPLOAD_ERR_NO_FILE:
$error_message = 'No file was uploaded.';
break;
case UPLOAD_ERR_NO_TMP_DIR:
$error_message = 'Missing a temporary folder.';
break;
case UPLOAD_ERR_CANT_WRITE:
$error_message = 'Failed to write file to disk.';
break;
case UPLOAD_ERR_EXTENSION:
$error_message = 'A PHP extension interrupted the upload.';
break;
default:
$error_message = 'Unknown error';
break;
}
return false;
}
$error_message = null;
return true;
}
is_uploaded_file()
est génial à utiliser, spécialement pour vérifier s'il s'agit d'un fichier téléchargé ou d'un fichier local (pour des raisons de sécurité).
Cependant, si vous souhaitez vérifier si l'utilisateur a téléchargé un fichier, utilisez $_FILES['file']['error'] == UPLOAD_ERR_OK
.
Voir le manuel PHP on messages d'erreur de téléchargement de fichier . Si vous voulez simplement vérifier l'absence de fichier, utilisez UPLOAD_ERR_NO_FILE
.