Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Загрузка изображений
 
 автор: kis-kis   (17.11.2008 в 13:00)   письмо автору
 
 

При заполнении формы возможно ли реализовать загрузку картинок во временный каталог с созданием уменьшенной копии?
Если форма заполнена верно то, изображения сохраняются в соответствующий каталог, если нет, то удаляются. Хотя бы принцип может кто-нибудь объяснить? Спасибо.

  Ответить  
 
 автор: sim5   (17.11.2008 в 13:22)   письмо автору
 
   для: kis-kis   (17.11.2008 в 13:00)
 

Загрузка изображений на сервер

  Ответить  
 
 автор: kis-kis   (17.11.2008 в 13:25)   письмо автору
 
   для: sim5   (17.11.2008 в 13:22)
 

=)
Вы всех туда отправляете?

  Ответить  
 
 автор: sim5   (17.11.2008 в 13:39)   письмо автору
 
   для: kis-kis   (17.11.2008 в 13:25)
 

А вам что надо? Готовый скрипт или понять как это делается? Если второе, то не мешает прочитать по этому поводу документацию.

  Ответить  
 
 автор: Николай2357   (17.11.2008 в 13:31)   письмо автору
 
   для: kis-kis   (17.11.2008 в 13:00)
 

Вот скриптик неплохой, я где то здесь находил. Делает уменьшенные копии.
$filename - путь до превьюшки
$w - максимальнй размер
<?  
function resizeimg($filename$w)  
{
$h $w;        
$size_img getimagesize($filename); 
     
    if ((
$size_img[0]<$w) && ($size_img[1]<$h)) return true;  
$src_ratio=$size_img[0]/$size_img[1];  
    if (
$src_ratio 1)  
    {  
    
$h $w/$src_ratio;  
    }  
    else  
    {  
    
$w $h*$src_ratio;  
    }
       
$dest_img imagecreatetruecolor($w$h);    
$white imagecolorallocate($dest_img255255255); 
        
    if (
$size_img[2]==2)  $src_img imagecreatefromjpeg($filename);                        
    else if (
$size_img[2]==1$src_img imagecreatefromgif($filename);                        
    else if (
$size_img[2]==3$src_img imagecreatefrompng($filename);
       
imagecopyresampled($dest_img$src_img0000$w$h$size_img[0], $size_img[1]);                  
  
    if (
$size_img[2]==2)  imagejpeg($dest_img$filename);                        
    else if (
$size_img[2]==1imagegif($dest_img$filename);                        
    else if (
$size_img[2]==3imagepng($dest_img$filename);   

imagedestroy($dest_img);  
imagedestroy($src_img);  
    return 
true;           
  }    
?>

  Ответить  
 
 автор: Trianon   (17.11.2008 в 14:02)   письмо автору
 
   для: Николай2357   (17.11.2008 в 13:31)
 

>Вот скриптик неплохой, я где то здесь находил. Делает уменьшенные копии.
> if ($size_img[2]==2) $src_img = imagecreatefromjpeg($filename);
> if ($size_img[2]==2) imagejpeg($dest_img, $filename);

Вы ничего не напутали?

  Ответить  
 
 автор: kis-kis   (17.11.2008 в 14:13)   письмо автору
 
   для: Trianon   (17.11.2008 в 14:02)
 

хорошо, тогда вопрос такой, допустим загрузили, создали уменьшенный копии, но пользователь отказался от заполнения формы, как удалить загруженные им изображения?
Спасибо.

  Ответить  
 
 автор: sim5   (17.11.2008 в 14:16)   письмо автору
 
   для: kis-kis   (17.11.2008 в 14:13)
 

Значит не читали то, что я вам сказал прочитать, иначе бы вопроса об удаленни не было. А если пользователь отправил форму (в которой и передается файл), то о каком отказе может идти речь?

  Ответить  
 
 автор: kis-kis   (17.11.2008 в 14:20)   письмо автору
 
   для: sim5   (17.11.2008 в 14:16)
 

отказ в том, что после передачи формы post идет проверка на наличие ошибок.

  Ответить  
 
 автор: sim5   (17.11.2008 в 14:33)   письмо автору
 
   для: kis-kis   (17.11.2008 в 14:20)
 

Когда вы принимаете форму, которая передает файл, тогда, перед сохранением изображения (!), и проверяется наличие ошибок. Но каких ошибок имеется ввиду? Если это ошибка, например, связанная с большим размером файла, то файл не будет закачан на сервер. Остальное, это выши условия. Кроме передачи файла, форма может передавать и другую информацию, так что "отказ/подтверждение" ваше и загрузкау файла организовывайте одной формой.

  Ответить  
 
 автор: kis-kis   (17.11.2008 в 14:41)   письмо автору
 
   для: sim5   (17.11.2008 в 14:33)
 

Да, я вас понял. Я имел ввиду ошибки в других полях формы, хорошо опустим это. Но, если они есть, и изображения не загружены, то пользователя придется каждый раз их снова загружать, ну или указывать к ним путь (пока в форме не останется ошибок), а это не есть удобно, вы согласны? Поэтому я и спрашивал, как сделать, чтобы при первой передаче формы, изображения загружались бы (если конечно ошибки не связаны с самими файлами), а если в форме так и остались ошибки и пользователь бросил ее заполнять, то изображения удалялись бы...
Так более-менее понятно? =)

  Ответить  
 
 автор: sim5   (17.11.2008 в 14:52)   письмо автору
 
   для: kis-kis   (17.11.2008 в 14:41)
 

Вы читали или нет мануал? Там черным по белому написано, что файл загружаются во временную папку, которая указана в переменной окружения сервера, и что вы обязаны перемещать его в конечную папку назначения, ибо этот файл будет удален мусорщиком в конечном итоге. Кто вас заставляет копировать этот файл, не проверив какие-то ошибки пользователя в этой же форме?

  Ответить  
 
 автор: kis-kis   (17.11.2008 в 15:05)   письмо автору
 
   для: sim5   (17.11.2008 в 14:52)
 

Не нужно нервничать... )

Я понял Вас, а как узнать путь к данному файлу? И можно ли когда он находится во временной директории создать его уменьшенную копию?

  Ответить  
 
 автор: sim5   (17.11.2008 в 15:08)   письмо автору
 
   для: kis-kis   (17.11.2008 в 15:05)
 

Было бы из-за чего нервничать. Какой путь? Прочтите мануал.

  Ответить  
 
 автор: kis-kis   (17.11.2008 в 15:09)   письмо автору
 
   для: sim5   (17.11.2008 в 15:08)
 

>> Там черным по белому написано, что файл загружаются во временную папку

Путь к временной папке.

  Ответить  
 
 автор: sim5   (17.11.2008 в 15:10)   письмо автору
 
   для: kis-kis   (17.11.2008 в 15:09)
 

А он вам нужен? Посмотрите пример загрузки файла, который есть в мануале.

  Ответить  
 
 автор: Николай2357   (17.11.2008 в 15:44)   письмо автору
 
   для: kis-kis   (17.11.2008 в 14:41)
 

>Но, если они есть, и изображения не загружены, то пользователя придется каждый раз их снова загружать, ну или указывать к ним путь (пока в форме не останется ошибок), а это не есть удобно,
Сделайте валидацию на аяксе и проблема отпадет сама собой.

  Ответить  
 
 автор: Trianon   (17.11.2008 в 15:59)   письмо автору
 
   для: Николай2357   (17.11.2008 в 15:44)
 

человек с загрузкой картинок справиться не может, а Вы его в в аякс отправляете.
ну не звер? :)

  Ответить  
 
 автор: kis-kis   (17.11.2008 в 21:46)   письмо автору
 
   для: Trianon   (17.11.2008 в 15:59)
 

Если сделать на ajaxe загрузку, допустим так


<form name="form1" method="post" action="" enctype="multipart/form-data">
  <input type="file" name="photo" id="photo" onchange="javascript: sendSearchRequest_3();">
</form>


То в результате, получаем путь до картинки - D:\documents\30d349ec6038.jpg

Исходя из этого, можно как-то ее загрузить, не пойму.

Спасибо за ответ.

  Ответить  
 
 автор: Николай2357   (17.11.2008 в 22:11)   письмо автору
 
   для: kis-kis   (17.11.2008 в 21:46)
 

Загружается все посто, без аякса. Это только проверка. А приемник должен быть другим, у Вас есть уже наверно. А чтоб картинку загрузить, читайте, что Вам посоветовали. Просто при такой проверке не нужно каждый раз файл в поле засовывать. Форма отправится только тогда, когда пройдет валидация.

  Ответить  
 
 автор: sim5   (18.11.2008 в 09:21)   письмо автору
 
   для: kis-kis   (17.11.2008 в 21:46)
 

Если вы установите ограничение, например, на тип файла, на его размер, на разрешение (если это картинка), то весь AJAX, это с боку припека будет, так как вышеуказанные ограничения вы сможите проверить только после загрузки файла на сервер. Забудьте вы о AJAX, научитесь сперва простому. Путь до картинки на локальном компьютере вам совсем не нужен, вся суть загрузки разъясняется в одной функции - move_uploaded_file().

  Ответить  
 
 автор: kis-kis   (18.11.2008 в 10:02)   письмо автору
2.2 Кб
 
   для: sim5   (18.11.2008 в 09:21)
 

Хорошо, посмотрите, плиз, вложенный файл.

Если Вы загрузите картинку, и не заполните текстовое поле, то потом вам будет нужно снова их загружать. Разве я не прав? (хотя в приведенном мной примере они загружаются в любом случае, даже если текст. поле не заполнено).

Тогда вопрос, а как сделать, рядом с полем file - маленькое превью из файлов с названием s_?

Можно конечно сделать так

<input type=\"hidden\" name=\"p1\" value=\"".$_FILES["photo_1"]['name']."\">


И путь к картинке тогда будет выглядеть так - <img src=\"s_".$_POST['p1']."\">

Но если трижды отправить форму с незаполненным текст. полем, то картинка теряется. Можно ли это исправить?
Спасибо.

  Ответить  
 
 автор: sim5   (18.11.2008 в 10:09)   письмо автору
 
   для: kis-kis   (18.11.2008 в 10:02)
 

Пороверку ввода текстовых полей, выбор селекта и т.п.., это уже Ajax, если не хотите перезагрузки. А остальное выбросить, еще раз вернуться к мануалу, прочитать, и уяcнить, что не стоит для загрузки файлов на сервер использовать функцию copy(), для этого существует функция move_uploaded_file() !
Если нет ошибок при загрузке файла на сервер (в частности получем его размер и другое), то ни к чему проверять на "пустоту" временное имя файла.

  Ответить  
 
 автор: kis-kis   (18.11.2008 в 10:38)   письмо автору
 
   для: sim5   (18.11.2008 в 10:09)
 

Мы никак не можем понять друг друга. На счет copy() понял, вот пример, что я хочу получить.

_http://www.e1.ru/auto/sale/manage.php

Посмотрите, плиз, так станет понятно. Просто загрузите, одно фото не заполняя ниодного поля. Заранее спасибо.

  Ответить  
 
 автор: sim5   (18.11.2008 в 10:41)   письмо автору
 
   для: kis-kis   (18.11.2008 в 10:38)
 

Какое фото и о какой загрузке речь, если это страница с регистрацией?

  Ответить  
 
 автор: kis-kis   (18.11.2008 в 10:51)   письмо автору
 
   для: sim5   (18.11.2008 в 10:41)
 

Да, с регистрацией, я Вам в пм отправил данные, чтобы Вы посмотрели.

  Ответить  
 
 автор: sim5   (18.11.2008 в 11:03)   письмо автору
 
   для: kis-kis   (18.11.2008 в 10:51)
 

Чего смотреть? Суть проста. Если вы, например, загрузите изображение от пользователя себе на сервер только в том случае, пока он не представиться в текстовом поле как "Петя", то проверяя это текстовое поле, вы будете знать "Петя" он или нет. И пока нет, возвращаете ему назад форму, пусть вводит "Петя". Как только вы получили необходимое, проверяете параметры присланного файла ($_FILES). Если загрузка файла прошла без ошибок ($_FILES['fielname']['error'] - не содержит ошибок), проверяете условия на загрузку файлов. Если условия не удовлетворяют вашим, возвращаете форму пользователю с полем имени уже заполненным ранее пользователем (Петя). И так, пока у кого нервы крепче - у Пети или у вашего скрипта :)
Как только все если в норме, вот тут и копируйте функцией move_uploaded_file() файл из временной папки в папку назначения.
А если вы не хотите постоянной перезагрузки страницы при ошибках ввода (но только текстовых полей, списков, радиокнопок, чекбоксов и т.п.), то используйте Ajax - вам уже приводили пример этого.

PS. Атрибут value поля элемента file формы только для чтения! А это значит, что вы не сможете указать ему значение, например, путь к файлу на локальной машине, которое вы можете получить от пользователя при отправке формы. Другими словами, при ошибках загрузки изображения, этот путь можете выбросить в помойку - присвоить его форме уже нельзя. Пользователь обязан выбрать файл вновь. Отсюда - хотите чтобы картиночку показывало рядом с полем выбора, значит используйте JS. На время "работы" страницы на стороне пользователя, он будет видеть картиночку выбранного файла.

  Ответить  
 
 автор: kis-kis   (18.11.2008 в 11:07)   письмо автору
 
   для: sim5   (18.11.2008 в 11:03)
 

-

  Ответить  
 
 автор: kis-kis   (18.11.2008 в 11:47)   письмо автору
 
   для: sim5   (18.11.2008 в 11:03)
 

Отсюда - хотите чтобы картиночку показывало рядом с полем выбора, значит используйте JS. На время "работы" страницы на стороне пользователя, он будет видеть картиночку выбранного файла.

Не поможете реализовать? :)

  Ответить  
 
 автор: sim5   (18.11.2008 в 11:57)   письмо автору
 
   для: kis-kis   (18.11.2008 в 11:47)
 

Ну если вам это так нужно, то в разделе HTML+JS есть примеры вывода картинок. Разница для вас будет лишь в том, что вы будете путь к картинке указывать локалного компьютера, полученный от атрибута value элемента file, а не сетевой. Сами примеры есть в указанном разделе, смотрите.
Собственно самый простой пример, это сделать видимым, после выбора пользователем изображения, например, элемент DIV с необходимым позиционированием относительно поля формы, в котором прописан элемент IMG, src которому вы и указываете тот, что получите у поля file. Размеры изображения укзывать в процентах, в сторону уменьшения, вот вам и предпросмотр.

  Ответить  
 
 автор: kis-kis   (18.11.2008 в 12:05)   письмо автору
 
   для: sim5   (18.11.2008 в 11:57)
 

Спасибо, сейчас попробую.

  Ответить  
 
 автор: Николай2357   (17.11.2008 в 15:39)   письмо автору
 
   для: Trianon   (17.11.2008 в 14:02)
 

Вы что так пугаете... :)))
Чего ж так к словам то цепляться... Ну ладно, пусть будет так:
Вот скриптик неплохой, я где то здесь находил. Уменьшает загруженное изображение.
Хотя какя по большому счету разница... Это разве не копия того, что загружает клиент?

  Ответить  
 
 автор: Trianon   (17.11.2008 в 16:02)   письмо автору
 
   для: Николай2357   (17.11.2008 в 15:39)
 

>Вы что так пугаете... :)))
>Ну ладно, пусть будет так:
>Вот скриптик неплохой, я где то здесь находил. Уменьшает загруженное изображение.
Уменьшает любое.

>Хотя какя по большому счету разница... Это разве не копия того, что загружает клиент?
Из скрипта ни коим образом не следует.

>Чего ж так к словам то цепляться...
доброй половине изрядному числу вопрошающих здесь не заржавеет напустить его на все картинки в каталоге.

  Ответить  
 
 автор: Николай2357   (17.11.2008 в 17:20)   письмо автору
 
   для: Trianon   (17.11.2008 в 16:02)
 

>изрядному числу вопрошающих здесь не заржавеет напустить его на все картинки в каталоге.
в муках рождается истина... :))

>человек с загрузкой картинок справиться не может, а Вы его в в аякс отправляете.
ну не звер? :)

действительно... бум реабелитироваться.

ajax.js
//Здесь путь от страницы до PHP модуля
var file="valid.php"; 

function Pusk()
{
    var m1, m2;

// Вынимаются данные регистрации.
     m1=window.document.getElementById('login').value;
     m2=window.document.getElementById('password').value;

// Можно еще добавлять через амперсанд
        query="login="+m1+"&password="+m2;
        
Request(query, file);
}

// Запрос
var req = Create();

function Create()

    if(navigator.appName == "Microsoft Internet Explorer"){ 
        req = new ActiveXObject("Microsoft.XMLHTTP"); 
    }else{ 
        req = new XMLHttpRequest(); 
    } 
    return req; 


function Request(query, file)
{

req.open('post', file, true );
req.onreadystatechange = Valid;
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

  req.send(query);             


// Вывод. 
function Valid()

var a = req.readyState; 
var    b = req.responseText; 

    if ( a == 4 && b == 100)// Если условный сигнал - сабмитится форма
    window.document.getElementById('userform').submit();
        if(a == 4 && b != 100 )// Если нет сигнала, выводятся ошибки
        window.document.getElementById('result').innerHTML = req.responseText; 
}


valid.php
<?php
// Кэшировать аякс нельзя, иначе динамики не будет вот заголовки против кэша
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");   
header("Cache-Control: no-cache, must-revalidate");   
header("Pragma: no-cache");   
header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");
// Инициализация
    
$login=isset($_POST['login'])?$_POST['login']:null;
    
$password=isset($_POST['password'])?$_POST['password']:null;
    
$error=array();
// Проверка
    
if(!$login$error[]="Вы не написали имя логин";
    if(!
$password$error[]="Вы не написали пароль";


    if(
count($error)!== 0)
    {
        for(
$i=0$i count($error); $i++)
        
$err.= ($i+1).".....".$error[$i]."<br>";
    
$echo"<b><em style='color:red'>Ошибка:</em></b><br>".$err
    } 
    else 
    {
    
$echo=100// Если нет ошибок - выводим условный сигнал. 
    
}
echo 
$echo;
?>

сюда можно сессию прикрутить и получится вполне сносно.

index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" />
<script type="text/javascript" src="ajax.js"></script>
</head>
<body>
<form id="userform" method="post" enctype="multipart/form-data">
<div id="result"></div>
<input id="login" type="text" /><br />
<input id="password" type="password" /><br />
<input id="file" type="file" /><br />
<input  type="button" onclick="Pusk()" value="пошел" />
</form>

</body>
</html>

обратите внимание на кодировки.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования