Работа с массивом PHP $_FILES

Я использую форму для загрузки изображения. После загрузки изображения мы сможем увидеть загруженное изображение. Затем я использовал JCrop (http://deepliquid.com/content/Jcrop.html), чтобы разрешить кадрирование для этого изображения. Предположим, меня интересуют только JPEG изображения. Затем я готов отправить форму.

После отправки формы я выполню некоторые манипуляции с изображением и обрежу изображение. Однако я хочу поместить информацию об этом обрезанном изображении обратно в массив $_FILES (это обязательно). Как мне манипулировать этим массивом $_FILES в PHP-скрипте?

Вот что я пробовал, и это не сработало.

$upload_dir = '/Users/user/Sites/tmp/';

$file_name = $_FILES['image']['name'];
$file_name = "cropped_".$file_name;
$tmp_name = $_FILES['image']['tmp_name'];
$file_size = $_FILES['image']['size'];

$src_file = imagecreatefromjpeg($tmp_name);

list($width,$height) = getimagesize($tmp_name);

// Creates cropped image
$tmp = imagecreatetruecolor($_POST['w'], $_POST['h']);
imagecopyresampled($tmp, $src_file, 0, 0, $_POST['x'], $_POST['y'], $_POST['w'], $_POST['h'], $_POST['w'], $_POST['h']);
$small_pic_file_path = $upload_dir.$file_name;

imagejpeg($tmp,$small_pic_file_path,85);
$message = "<img src='http://localhost/~user/tmp/".$file_name."'>";

$_FILES['image']['name'] = $file_name;
$_FILES['image']['type'] = "image/jpeg";
// unlink($tmp_name);
// if(!move_uploaded_file($upload_dir.$file_name, $tmp_name)) echo "Failure Moving Image";
$_FILES['image']['tmp_name'] = $upload_dir.$file_name;
$_FILES['image']['error'] = 0;
$sizes = getimagesize($upload_dir.$file_name);
$_FILES['image']['size'] = ($sizes['0'] * $sizes['1']);

Можно ли изменить этот массив $_FILES?


person sifxtreme    schedule 10.01.2013    source источник
comment
Я не понимаю, почему бы и нет. Но вы всегда можете сделать его копию и делать то, что хотите.   -  person ethrbunny    schedule 11.01.2013


Ответы (2)


Только изменение в глобальном массиве не сработает. Вы просто говорите, что $_FILES['image']['tmp_name'] будет вновь созданным. Но местоположение tmp имеет тот же старый файл.

Но вы должны обновить изображение в папке /tmp.

Получите свой tmp путь и copy изображение там.

вид copy($newImage, /tmp) - получить путь к папке tmp от php.ini

person Sahal    schedule 11.01.2013
comment
Спасибо! Это решение, которое я искал. Раньше я использовал move_uploaded_file вместо rename или copy. move_uploaded_file можно применять только к файлам, загруженным методом POST. - person sifxtreme; 11.01.2013

Не рекомендуется изменять суперглобальную переменную, вам лучше скопировать ее в другую переменную, а затем делать все, что хотите.

person Genesor    schedule 11.01.2013
comment
Чтобы уточнить @Genesor, массив _FILES создается на основе вашего файла. Вам лучше создавать свои собственные переменные: $size = $sizes[0] * $sizes[1]; - person Richard Testani; 11.01.2013
comment
Я понимаю, что это может быть не лучший подход, но я определенно хотел бы отредактировать массив FILES, если это возможно. Это связано с тем, что какая-то более поздняя функция будет обрабатывать массив FILES, а не какую-либо другую переменную, которую я создаю. Я хотел бы посмотреть, возможно ли решить это таким образом, иначе мне придется выяснить, где/как работает эта другая функция. - person sifxtreme; 11.01.2013
comment
Ничто не мешает вам, если вы не можете делать то, что хотите, без изменения $_FILES, попробуйте изменить его. - person Genesor; 11.01.2013