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
Форумы портала PHP.SU :: Версия для печати :: создание изображения из файла, отправленного аяксом
Форумы портала PHP.SU » » Графика в PHP » создание изображения из файла, отправленного аяксом

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

1. grechan - 01 Декабря, 2012 - 00:58:35 - перейти к сообщению
После отправки файла (изображения) аяксом пытаюсь создать изображение через imagecreatefromjpeg. Файл точно загружается но изображение не создаётся. Позже понял, что на сервер оно приходит в виде бинарной строки. можно ли средствами пхп преобразовать бинарную строку до такого вида, чтобы изображение можно было создать imagecreatefromjpeg? Или может быть есть возможность получить изображение напрямую из бинарного потока? Файл формируется filereader-ом. Или искать пути решения на стороне клиента?
2. sKaa - 01 Декабря, 2012 - 01:17:35 - перейти к сообщению
Ajax в принципе не способен отправлять файлы! У вас проблема в чём-то другом. Код в студию.
3. grechan - 01 Декабря, 2012 - 01:42:13 - перейти к сообщению
Вот этим отправляю
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.  
4. sKaa - 01 Декабря, 2012 - 02:55:31 - перейти к сообщению
Если не углубляться, то вы просто отправляете какую-то строку на сервер. Повторяю, сам 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
5. esterio - 01 Декабря, 2012 - 11:08:21 - перейти к сообщению
sKaa пишет:
Повторяю, сам ajax не способен отправлять файлы целиком.

HTML 5 уже позволяет такое делать
http://www[dot]html5rocks[dot]com/ru/tut[dot][dot][dot]s/file/dndfiles/
6. grechan - 01 Декабря, 2012 - 23:25:35 - перейти к сообщению
HTML5 File Api уже позволяет отправлять средствами ajax файлы на сервер. Более того появилась новая возможность отображать миниатюры загружаемых изображений на сервер (не через iframe), после чего файл или несколько файлов отправляются на сервер через ajax. Это я и пробую сейчас оформить на сайте. На забруговых сайтах уже давно есть готовые скрипты для реализации всего этого, я просто пытаюсь под себя чуть-чуть переделать ну и разобраться конечно же не помешало бы.
Что касается отправки клиентом инфы, а также получения ее на сервер - у меня сомнений нет - отправляется и загружается. А вот, что дальше делать с полученным файлом, я не знаю.
Вроде как вижу 2 пути решения
1. Отправлять с нужной кодировкой (шифрованием, представлением данных), что бы пхп без проблем мог это все съесть
2. Знать что же я загрузил, и дальше пережёвывать это уже на сервере.
7. grechan - 06 Декабря, 2012 - 00:07:41 - перейти к сообщению
От 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.  


На выходе получилось:
выбор файлов, до их отправки на сервер - отображение в виде миниатюр, с которыми можно делать все, что угодно, а потом отправка их сервер.

 

Powered by ExBB FM 1.0 RC1