Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: создание изображения из файла, отправленного аяксом

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: можно ли это сделать
grechan
Отправлено: 01 Декабря, 2012 - 00:58:35
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




После отправки файла (изображения) аяксом пытаюсь создать изображение через imagecreatefromjpeg. Файл точно загружается но изображение не создаётся. Позже понял, что на сервер оно приходит в виде бинарной строки. можно ли средствами пхп преобразовать бинарную строку до такого вида, чтобы изображение можно было создать imagecreatefromjpeg? Или может быть есть возможность получить изображение напрямую из бинарного потока? Файл формируется filereader-ом. Или искать пути решения на стороне клиента?
 
 Top
sKaa
Отправлено: 01 Декабря, 2012 - 01:17:35
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Ajax в принципе не способен отправлять файлы! У вас проблема в чём-то другом. Код в студию.
 
 Top
grechan
Отправлено: 01 Декабря, 2012 - 01:42:13
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Вот этим отправляю
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. function uploadFile(file, url) {
  3.  
  4.   var reader = new FileReader();
  5.  
  6.   reader.onload = function() {    
  7.     var xhr = new XMLHttpRequest();    
  8.    
  9.     xhr.upload.addEventListener("progress", function(e) {
  10.       if (e.lengthComputable) {
  11.         var progress = (e.loaded * 100) / e.total;
  12.         /* ... обновляем инфу о процессе загрузки ... */
  13.       }
  14.     }, false);
  15.        
  16.         if (!XMLHttpRequest.prototype.sendAsBinary) {
  17.  
  18.     XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
  19.         function byteValue(x) {
  20.             return x.charCodeAt(0) & 0xff;
  21.             }
  22.         var ords = Array.prototype.map.call(datastr, byteValue);
  23.         var ui8a = new Uint8Array(ords);
  24.         this.send(ui8a.buffer);
  25.         }
  26.     }
  27.    
  28.     /* ... можно обрабатывать еще события load и error объекта xhr.upload ... */
  29.  
  30.     xhr.onreadystatechange = function () {
  31.       if (this.readyState == 4) {
  32.         if(this.status == 200) {
  33.           document.getElementById("status").innerHTML=xhr.responseText;
  34.                   /* ... все ок! смотрим в this.responseText ... */
  35.         } else {
  36.           /* ... ошибка! ... */
  37.         }
  38.       }
  39.     };
  40.    
  41.     xhr.open("POST", url);
  42.     var boundary = "xxxxxxxxx";    
  43.     // Устанавливаем заголовки
  44.     xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
  45.     xhr.setRequestHeader("Cache-Control", "no-cache");    
  46.     // Формируем тело запроса
  47.     var body = "--" + boundary + "\r\n";
  48.     body += "Content-Disposition: form-data; name='myFile'; filename='" + file.name + "'\r\n";
  49.     body += "Content-Type: application/octet-stream\r\n\r\n";
  50.     body += reader.result + "\r\n";
  51.     body += "--" + boundary + "--";
  52.         xhr.send(body);
  53.     /*if(xhr.sendAsBinary) {
  54.       // только для firefox
  55.       xhr.sendAsBinary(body);
  56.     } else {
  57.       // chrome (так гласит спецификация W3C)
  58.       xhr.send(body);
  59.     }*/
  60.   };
  61.   // Читаем файл
  62.   reader.readAsBinaryString(file);
  63. }
  64.  
  65.  
  66. uploadAll.onclick=function()
  67. {
  68. var list=document.getElementsByTagName('LI')[0];
  69. uploadFile(list.file, "ajax.php");
  70. }
  71.  

, а вот этим обрабатываю
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. $error = $_FILES['file']['error'];
  5.   switch($error) {
  6.     case 0 :
  7.       $error = 'файл загружен';
  8.       break;    
  9.     case 1 : case 2 :
  10.       $error = 'слишком большой файл';
  11.       break;
  12.     case 3 :
  13.       $error = 'файл загружен частично';
  14.       break;
  15.     case 4 :
  16.       $error = 'файл не был загружен';
  17.   }  
  18. echo $error.'</br>';
  19. $im = imagecreatefromjpeg($_FILES['myFile']['tmp_name']);
  20. if (!$im) echo 'дело дрянь </br>';
  21. $imx = imagesx($im); //исходная ширина
  22. $imy = imagesy($im);
  23. $newx_b = $imx; //ширина
  24. $newy_b = $imy; //высота
  25. $folder = $_SERVER['DOCUMENT_ROOT'].'/temp/';
  26. $file_name = $_FILES['myFile']['name'];
  27.  
  28. $canvas_b = imagecreatetruecolor($newx_b, $newy_b);//новая чистая картинка (imagecreate, imagecreatetruecolor)
  29. imagecolortransparent($canvas_b, imagecolorallocate($canvas_b, 0, 0, 0));
  30. imagealphablending($canvas_b, false);
  31. imagesavealpha($canvas_b, true);
  32.  
  33. imagecopyresampled($canvas_b, $im, 0, 0, 0, 0, $newx_b, $newy_b, $imx, $imy);//наложение изображений (imagecopy, imagecopyresized, imagecopyresampled)
  34.  
  35. //**************************************************************************************************
  36. //Записываем файл      
  37. //**************************************************************************************************
  38.  
  39. $result=imagejpeg($canvas_b,$folder.$file_name);
  40.  
  41. if ($result==true)
  42. {
  43.         echo 'Файл записан';
  44. }
  45. else
  46. {
  47.         echo 'Файл не записан';
  48. }
  49. ?>
  50.  
 
 Top
sKaa
Отправлено: 01 Декабря, 2012 - 02:55:31
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Если не углубляться, то вы просто отправляете какую-то строку на сервер. Повторяю, сам ajax не способен отправлять файлы целиком.
Но раз уж вы отправляете строку, зачем вы ищете что-то в массиве $_FILES ??

Более того, первое, что бросилось в глаза: imagecreatefromjpeg - создаёт новое изображение из файла или URL.
В качестве аргумента эта функция принимает путь к файлу или URL, но никак не сообщение об ошибке которое выплюнет в него $_FILES['myFile']['tmp_name'].

Первое, что нужно, это проверить, что приходит. Закоментируйте весь ваш скрипт.

$files = var_export($_FILES, true);
$post = var_export($_POST, true);

А содержание этих двух переменных попытайтесь записать в лог или просто в txt.
Посмотрите, что там получится.

На самом деле не очень понятно, что это такое : var reader = new FileReader();
И вот первый попавшийся мне мануал по этому поводу. Поглядите как реализовано там, массивы POST и FILES вообще не причем, ведь файл целиком вы и не отправляли, так ведь?


CODE (javascript):
скопировать код в буфер обмена
  1. function uploadFile(file, trnum) {
  2.     if (file) {
  3.         var xhr = new XMLHttpRequest();
  4.  
  5.         upload = xhr.upload;
  6.  
  7.         // Создаем прослушиватель события progress, который будет "двигать" прогресс-бар.
  8.         upload.addEventListener('progress', function(event) {
  9.             if (event.lengthComputable) {
  10.                 var pbar = $('tr.' + trnum + ' td.size div.pbar');
  11.                 pbar.css('width', Math.round((event.loaded / event.total) * 100) + 'px');
  12.             }
  13.         }, false);
  14.         // Создаем прослушиватель события load, который по окончанию загрузки подсветит прогресс-бар зеленым.
  15.         upload.addEventListener('load', function(event) {
  16.             var pbar = $('tr.' + trnum + ' td.size div.pbar');
  17.             pbar.css('width', '100px');
  18.             pbar.css('background', 'green');
  19.         }, false);
  20.         // Создаем прослушиватель события error, который при ошибке подсветит прогресс-бар красным.
  21.         upload.addEventListener('error', function(event) {
  22.             var pbar = $('tr.' + trnum + ' td.size div.pbar');
  23.             pbar.css('width', '100px');
  24.             pbar.css('background', 'red');
  25.         }, false);
  26.  
  27.         // Откроем соединение.
  28.         xhr.open('POST', 'handler.php');
  29.  
  30.         // Устанавливаем заголовки.
  31.         xhr.setRequestHeader('Cache-Control', 'no-cache');
  32.         xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  33.         xhr.setRequestHeader("X-File-Name", file.name);
  34.         // Отправляем файл.
  35.         xhr.send(file);
  36.     }
  37. }


PHP:
скопировать код в буфер обмена
  1. if (!array_key_exists('HTTP_X_FILE_NAME', $_SERVER) || !array_key_exists('CONTENT_LENGTH', $_SERVER))
  2.     exit();
  3.  
  4. $fname = $_SERVER['HTTP_X_FILE_NAME'];
  5. $fsize = $_SERVER['CONTENT_LENGTH'];
  6.  
  7. if (!$fsize)
  8.     exit();
  9.  
  10. file_put_contents("upload/".$fname, file_get_contents("php://input"));

(Добавление)
http://www[dot]pvsm[dot]ru/javascript/17068
 
 Top
esterio
Отправлено: 01 Декабря, 2012 - 11:08:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




sKaa пишет:
Повторяю, сам ajax не способен отправлять файлы целиком.

HTML 5 уже позволяет такое делать
http://www[dot]html5rocks[dot]com/ru/tut[dot][dot][dot]s/file/dndfiles/
 
 Top
grechan
Отправлено: 01 Декабря, 2012 - 23:25:35
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




HTML5 File Api уже позволяет отправлять средствами ajax файлы на сервер. Более того появилась новая возможность отображать миниатюры загружаемых изображений на сервер (не через iframe), после чего файл или несколько файлов отправляются на сервер через ajax. Это я и пробую сейчас оформить на сайте. На забруговых сайтах уже давно есть готовые скрипты для реализации всего этого, я просто пытаюсь под себя чуть-чуть переделать ну и разобраться конечно же не помешало бы.
Что касается отправки клиентом инфы, а также получения ее на сервер - у меня сомнений нет - отправляется и загружается. А вот, что дальше делать с полученным файлом, я не знаю.
Вроде как вижу 2 пути решения
1. Отправлять с нужной кодировкой (шифрованием, представлением данных), что бы пхп без проблем мог это все съесть
2. Знать что же я загрузил, и дальше пережёвывать это уже на сервере.
 
 Top
grechan
Отправлено: 06 Декабря, 2012 - 00:07:41
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




От FileReader-а все-таки решил отказаться. Решил использовать FormData, и у меня все получилось, хотя реализовать хотел совсем по другому.
Вот этим отправляю
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. function uploadFile(file, url) {
  3.         var form = document.forms.myform;
  4.         var formData = new FormData(form);
  5.         formData.append("myfile", file);
  6.     var xhr = new XMLHttpRequest();    
  7.    
  8.     xhr.upload.addEventListener("progress", function(e) {
  9.       if (e.lengthComputable) {
  10.         var progress = (e.loaded * 100) / e.total;
  11.         /* ... обновляем инфу о процессе загрузки ... */
  12.       }
  13.     }, false);
  14.         /*xhr.upload.addEventListener("loadstart", function(e) {
  15.       alert ("Загрузка началась");
  16.     }, false);*/
  17.    
  18.     /* ... можно обрабатывать еще события load и error объекта xhr.upload ... */
  19.  
  20.     xhr.onreadystatechange = function () {
  21.       if (this.readyState == 4) {
  22.         if(this.status == 200) {
  23.           document.getElementById("status").innerHTML=xhr.responseText;
  24.                   /* ... все ок! смотрим в this.responseText ... */
  25.         } else {
  26.           /* ... ошибка! ... */
  27.         }
  28.       }
  29.     };
  30.    
  31.         var xhr = new XMLHttpRequest();
  32.         xhr.open("POST", url);
  33.        
  34.         xhr.send(formData);
  35. }
  36.  


и вот так обрабатываю
PHP:
скопировать код в буфер обмена
  1.  
  2. $error = $_FILES['myfile']['error'];
  3.   switch($error) {
  4.     case 0 :
  5.       $error = 'файл загружен';
  6.       break;    
  7.     case 1 : case 2 :
  8.       $error = 'слишком большой файл';
  9.       break;
  10.     case 3 :
  11.       $error = 'файл загружен частично';
  12.       break;
  13.     case 4 :
  14.       $error = 'файл не был загружен';
  15.   }  
  16. echo $error.'</br>';
  17. function transliterate_file($st_transliterate_file)
  18. {
  19. $st_transliterate_file = strtr($st_transliterate_file,'','');
  20.  
  21. $st_transliterate_file = strtr($st_transliterate_file, array(
  22. '0'=>'0','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9',' '=>'-','-'=>'-','+'=>'-','_'=>'-','='=>'','*'=>'','\\'=>'','/'=>'','('=>'',')'=>'','['=>'',']'=>'','{'=>'','}'=>'','<'=>'','>'=>'','.'=>'',','=>'','\"'=>'',':'=>'',';'=>'','!'=>'','?'=>'','№'=>'','%'=>'','$'=>'','&'=>'','#'=>'','@'=>'',
  23. 'а'=>'a','А'=>'a','б'=>'b','Б'=>'b','в'=>'v','В'=>'v','г'=>'g','Г'=>'g','д'=>'d','Д'=>'d','е'=>'e','Е'=>'e','ё'=>'e','Ё'=>'e','ж'=>'zh','Ж'=>'zh','з'=>'z','З'=>'z','и'=>'i','И'=>'i','й'=>'j','Й'=>'j','к'=>"k",'К'=>"k",'л'=>'l','Л'=>"l",'м'=>'m','М'=>'m','н'=>'n','Н'=>'n','о'=>'o','О'=>'o','п'=>'p','П'=>'p','р'=>'r','Р'=>'r','с'=>'s','С'=>'s','т'=>'t','Т'=>'t','у'=>'u','У'=>'u','ф'=>'f','Ф'=>'f','х'=>'h','Х'=>'h','ц'=>'c','Ц'=>'c','ч'=>'ch','Ч'=>'ch','ш'=>'sh','Ш'=>'sh','щ'=>'shch','Щ'=>'shch','ъ'=>'','Ъ'=>'','ы'=>'y','Ы'=>'y','ь'=>'','Ь'=>'','э'=>'ee','Э'=>'ee','ю'=>'yu','Ю'=>'yu','я'=>'ya','Я'=>'ya',
  24. ));  
  25. return $st_transliterate_file;
  26. }
  27.  
  28. if (!empty($_FILES['myfile']['name']))
  29. {
  30.         $im = imagecreatefromjpeg($_FILES['myfile']['tmp_name']);
  31.         $imx = imagesx($im); //исходная ширина
  32.         $imy = imagesy($im);
  33.         $newx_b = $imx; //ширина
  34.         $newy_b = $imy; //высота
  35.         $folder = $_SERVER['DOCUMENT_ROOT'].'/temp/';
  36.         $folder_temp = '/temp/';
  37.         $file_name = $_FILES['myfile']['name'];
  38.         $file_name_array = explode('.', $file_name);
  39.         $file_name_array[0] = transliterate_file ($file_name_array[0]);
  40.         $file_name_array[0] = strtolower ($file_name_array[0]);
  41.         $file_name_array[1] = strtolower ($file_name_array[1]);
  42.         //Формируем название большого файла
  43.         $file_name = implode (".",$file_name_array);
  44.        
  45.         echo '$file_name'.$file_name;
  46.         $canvas_b = imagecreatetruecolor($newx_b, $newy_b);//новая чистая картинка (imagecreate, imagecreatetruecolor)
  47.         imagecolortransparent($canvas_b, imagecolorallocate($canvas_b, 0, 0, 0));
  48.         imagealphablending($canvas_b, false);
  49.         imagesavealpha($canvas_b, true);
  50.        
  51.         imagecopyresampled($canvas_b, $im, 0, 0, 0, 0, $newx_b, $newy_b, $imx, $imy);//наложение изображений (imagecopy, imagecopyresized, imagecopyresampled)
  52.        
  53.         //**************************************************************************************************
  54.         //Записываем файл      
  55.         //**************************************************************************************************
  56.        
  57.         $result=imagejpeg($canvas_b,$folder.$file_name);
  58.        
  59.         if ($result==true)
  60.         {
  61.                 echo 'Файл записан';
  62.         }
  63.         else
  64.         {
  65.                 echo 'Файл не записан';
  66.         }
  67. }
  68. else
  69. {
  70. echo 'Файл не выбран';
  71. }
  72.  
  73. ?>
  74.  


На выходе получилось:
выбор файлов, до их отправки на сервер - отображение в виде миниатюр, с которыми можно делать все, что угодно, а потом отправка их сервер.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Графика в PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB