2014-11-18 2 views
-1

Как загрузить изображение и сохранить его в файле cookie? Я хочу иметь возможность загружать изображение с ограничениями, например. ограничение размера файла.Как загрузить изображение с помощью PHP?

Вот мой PHP код:

<?php 
$target_dir = "uploads/"; 
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); 
$uploadOk = 1; 
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); 
// Check if image file is a actual image or fake image 
if(isset($_POST["submit"])) { 
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); 
    if($check !== false) { 
     echo "File is an image - " . $check["mime"] . "."; 
     $uploadOk = 1; 
    } else { 
     echo "File is not an image."; 
     $uploadOk = 0; 
    } 
} 
// Check if file already exists 
if (file_exists($target_file)) { 
    echo "Sorry, file already exists."; 
    $uploadOk = 0; 
} 
// Check file size 
if ($_FILES["fileToUpload"]["size"] > 500000) { 
    echo "Sorry, your file is too large."; 
    $uploadOk = 0; 
} 
// Allow certain file formats 
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" 
&& $imageFileType != "gif") { 
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; 
    $uploadOk = 0; 
} 
// Check if $uploadOk is set to 0 by an error 
if ($uploadOk == 0) { 
    echo "Sorry, your file was not uploaded."; 
// if everything is ok, try to upload file 
} else { 
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { 
     echo "The file ". basename($_FILES["fileToUpload"]["name"]). " has been uploaded."; 
    } else { 
     echo "Sorry, there was an error uploading your file."; 
    } 
} 
?> 

В этом коде есть функция, чтобы загрузить файл с ограничениями на.

Вот мой HTML-код:

<!DOCTYPE html> 
<html> 

<head> 
    <link href="bitnami.css" media="all" rel="Stylesheet" type="text/css" /> 
    <link href="test.php"/> 
</head> 

<body> 

<form action="upload.php" method="post" enctype="multipart/form-data"> 
    Select image to upload: 
    <input type="file" name="fileToUpload" id="fileToUpload"> 
    <input type="submit" value="Upload Image" name="submit"> 
</form> 

</body> 
</html> 
+0

Я не думаю, что вы можете поместить целое изображение в файл cookie o.o –

+0

Как я могу сохранить изображение? – Garrett

+0

Несмотря на то, что я не могу представить себе сценарий, в котором это должно быть полезно, на самом деле ** возможно сохранить изображение в файл cookie с помощью 'base64_encode()' –

ответ

4

У вас есть несколько ошибок в вашей логике.

1) Вы никогда не проверяете, действительно ли была выполнена загрузка. Вы только начинаете работать с ['tmp_name'], даже не проверяя, действительно ли он существует. Ваш ПЕРВЫЙ действие на обработке загрузки должна быть проверка на наличие ошибок:

if ($_FILES["fileToUpload"]['error'] !== UPLOAD_ERR_OK) { 
    die("Upload failed with error code " . $_FILES['fileToUpload']['error']); 
} 

2) Вы проверки типов файлов на основе расширений файлов. Ничто не говорит, что пользователь не может сделать ren nastyvirus.exe cutekittens.jpg и пройти проверку вашего имени файла. Вы уже используете getimagesize() позже, поэтому проверка расширения бессмысленно:

$info = getimagesize($_FILES['fileToUpload']['tmp_name']); 

if ($info === false) { 
    die("Not an image at all"); 
} 

if (($info[2] != IMGTYPE_GIF) && ($info[2] != IMGTYPE_JPG) && ($info[2] != IMGTYPE_PNG)) { 
    die("Not a gif/jpg/png"); 
} 

if (($info[0] > $maximum_width) || ($info[1] > $maximum_height)) { 
    die("Too tall/wide"); 
} 

А потом, в конце концов, что - почему хранить его в печенье? Файлы cookie, естественно, ограничены в максимальном объеме данных, которые могут быть сохранены. Вы не должны выставлять, чтобы иметь возможность хранить больше пары килобайт в лучшем случае. Поскольку вы установили ограничение на размер загружаемого файла на 500 тыс., Вы получите поврежденные/усеченные изображения, если вы сохраните 500 тыс. В этом файле cookie 1-2 тыс.

+0

Спасибо! :) Тебе не понравился мой вопрос? – Garrett

+0

Я бы предложил использовать 'IMAGETYPE_ *' вместо 'IMG_ *', так как есть некоторые известные ошибки, связанные с 'IMG_ * '. Кроме того, всегда помните, что третий индекс (getimagesize()) будет предоставлять только тип, указанный в http-заголовке клиента, и поэтому никогда не следует полагаться на безопасность. –

+0

@ice: э-э, что? getimagesize извлекает данные непосредственно из файла. ему все равно, что клиент сказал в заголовках выгрузки. gis() не знает, откуда пришел этот образ, он смотрит только на данные на диске. Хорошая точка в константах imagetype tho. исправление это. –