Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.04.2011, 12:05
JeStas вне форума Посмотреть профиль Отправить личное сообщение для JeStas Найти все сообщения от JeStas
  № 1  
Ответить с цитированием
JeStas

Регистрация: Mar 2011
Сообщений: 5
По умолчанию Flex+PHP -проблема загрузки файлов

Уважаемые ГУРУ AS!
Прошу прощения, за отдельную тему, но просмотрел все темы катающиеся ошибки "SecurityError: Error #2000: Отсутствует активный контекст безопасности."
Нигде нет вразумительного ответа, перерыл весь интернет - ситуация аналогичная.
Теперь по сути:
1.Есть код:
Код AS3:
		var fileData:FileReference = new FileReference;
				var uploadURL:URLRequest = new URLRequest("upload.php");
				uploadURL.data = new URLVariables("mode=1")
				uploadURL.method = URLRequestMethod.POST;
				var elem:Object = new Object;
				elem = photos.getItemAt(num);
				fileData = FileReference(elem.fr);				
				fileData.upload(uploadURL,"Filedata", false);
				fileData.addEventListener(Event.COMPLETE,onFileUploaded);
				fileData.addEventListener(HTTPStatusEvent.HTTP_STATUS,onFilesUploadedErr);
2.На локальном сервере все работает отлично;
3.На удаленном (хостинг) - выдает ошибку;
4.Попытка изменить вызов отправки файла на setTimeout( function():void{upfr.upload(uploadURL);}, 1); - как описано в блогах с данной проблемой эффекта не дает;
5.Размещение crossdomain.xml - эффекта не дает.
6.Добавление
Код AS3:
Security.allowInsecureDomain("*")
	  Security.allowDomain("*");
	  Security.loadPolicyFile("crossdomain.xml");
- ситуация аналогичная...
7.Согласно help.adobe.com - все должно работать без проблем (домен вызова flash и запуска скрипта загрузки один), по данной ошибке существует только упоминание в таблице ошибок времени выполнения.
Прошу не пинать и не посылать в man - опыт программирования достаточен (более 10 лет), но с AS - всего несколько месяцев. Поэтому я тут...
Заранее благодарен, за ответы!

Старый 04.04.2011, 14:20
kseniya вне форума Посмотреть профиль Отправить личное сообщение для kseniya Найти все сообщения от kseniya
  № 2  
Ответить с цитированием
kseniya
 
Аватар для kseniya

Регистрация: Oct 2010
Адрес: Новосиб
Сообщений: 122
Код AS3:
Security.loadPolicyFile("http://сайт/crossdomain.xml");
//....
var uploadURL:URLRequest = new URLRequest("http://сайт/upload.php");
попробуйте просто явно выполнить browse и затем upload
Код AS3:
var fileReference:FileReference = new FileReference();
fileReference.addEventListener(Event.SELECT,fileSelect);
fileReference.browse();
function fileSelect(e:Event):void {
	fileReference.upload(new URLRequest("http://сайт/uplodad.php"), "upload");
	fileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadComplite);
}
function uploadComplite(e:DataEvent):void {
	//загрузка завершена
}
На сколько мне не изменяет память upload для fileReference будет работать только в том случае если вызван browse и выбран файл на компьюторе пользователя
используйте класс MultipartData для отправки изображений
Код AS3:
var img_to_post:ByteArray = JPEGEncoder.encode(img);
var mdata:MultipartData = new MultipartData();
//MultipartData и JPEGEncoder ищем в сети
mdata.addFile(img_to_post, "photo", "photo.jpg");
var urlRequest = new URLRequest(send_url);
urlRequest.url = send_url;
urlRequest.method = URLRequestMethod.POST;;
urlRequest.requestHeaders.push(new URLRequestHeader("Content-type", "multipart/form-data; boundary=" + MultipartData.BOUNDARY));
urlRequest.data = mdata.data;
var urlLoader:URLLoader = new URLLoader();
urlLoader.load(urlRequest);
в пхп соответсвенно
PHP код:
$_FILES["photo"]; 
Но у URLLoader есть один минус он не может отправлять файлы без мышиного событий (таймером вы не отправите)


Последний раз редактировалось kseniya; 04.04.2011 в 14:43.
Старый 04.04.2011, 14:42
JeStas вне форума Посмотреть профиль Отправить личное сообщение для JeStas Найти все сообщения от JeStas
  № 3  
Ответить с цитированием
JeStas

Регистрация: Mar 2011
Сообщений: 5
Спасибо kseniya - пробовал не помогает.
Кстати на личном опыте проверенно, что во flex работают и абсолютные и относительные пути!!!
Уже голову сломал.... а каменный цветок не выходит....
При этом обнаружил, что у меня не работает demo и http://weblog.cahlan.com/2006/09/upl...x-and-php.html, и http://weblog.cahlan.com/2006/12/fle...component.html - ошибка SecurityError
Или у них не работает!!!!

Просто явно выполнить browse и затем upload - не получится к сожалению, так как выбранные с помощью FileReference помещаются в объект к которому прибиндин DataGrid c ItemRender Canvas и ItemRender CheckBox - пользователь выбирает нужный и отправляет на закачку. Но на локальной машине - то работает!!!!! Вот в чем вопрос.....????

MultipartData - не найден на help.adobe.ru, нагуглил только для C#.
Попробовал отправить объект - сформированный по образу и подобию - эффекта ноль....

Думал баг с adobe flash pleer'ом - пере установил, теперь виден только результат работы самого swf(error event'ы) - ошибок не выдает, не работает нужным образом и в режим дебагера не запускается!!!! Не решилось никак!!!
Буду копать дальше.
НО все равно огромное спасибо, за внимание к моей проблеме.
Может быть, кто-нибудь знает, как файлы через RPC-передавать, как например в AMF?

Возник вопрос: Может быть я не правильно публикую (простым копированием)? Если, кто знает как правильно - подскажите пожалуйста???

Добавлено через 46 часов 4 минуты
Решил проблему через AMPPHP 1.9+Flex...
1.Код Flex:
Код AS3:
private var frList:FileReference = new FileReference;
frList.addEventListener(Event.SELECT, addFiles);
frList.addEventListener(Event.COMPLETE, completeUpload);
 
private function uploadImage():void
   {
	frList.browse([new FileFilter("Картинки JPG, PNG, GIF","*.jpg;*.jpeg;*.png;*.gif")]); \\Выбираем файл
   }
private function addFiles(event:Event):void
  {
	frList.load(); \\Загружаем выбранный файл после по событию выбора				
  }
 
private function resizeBitmap(target:Bitmap):void 
  {
	if (target.height>target.width) 
        {
	   target.width=1024;
	   target.scaleY=target.scaleX;
	      } 
                 else if (target.width >= target.height) 
                {
		     target.height=768;
		     target.scaleX=target.scaleY;
		}				
  }
 
private function uploadResizedImage(target:Bitmap):void 
   {
	var bmd:BitmapData=new BitmapData(target.width,target.height);
	bmd.draw(target, new Matrix(target.scaleX, 0, 0, target.scaleY));
	var encoded_jpg:JPEGEncoder = new JPEGEncoder(50); 
	var jpg_binary:ByteArray=encoded_jpg.encode(bmd); \\Кодируем в jpeg
	articleImageService.getOperation("saveImage").send(jpg_binary); \\Отправляем на сервер AMFPHP
   }
 
private function completeUpload(event:Event):void
   {
	byteArrayToBitmapData(frList.data); \\Преобразуем ByteArray в BitmapData
   }
 
private function byteArrayToBitmapData(ba:ByteArray):void 
   {
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, getBitmapData);
	loader.loadBytes(ba);\\Загружаем ByteArray в Loader - преобразуем в BitmapData
   }
 
private function getBitmapData(e:Event):void \\Формируем Bitmap
   {
	var content:* = loader.content;
	var BMPData:BitmapData = new BitmapData(content.width,content.height);
	var UIMatrix:Matrix = new Matrix();
	BMPData.draw(content, UIMatrix);
	var bm:Bitmap = new Bitmap(BMPData);
	if (bm.width>1024||bm.height>768) 
        {
		resizeBitmap(bm); \\Передаем в ресайзер
	}
	uploadResizedImage(bm); \\Сразу передаем в загрузчик
    }
2.Код MXML Flex:
Код AS3:
<s:RemoteObject endpoint="gateway.php"
						source="saveImage" destination="saveImage"
						id="saveImageService"
						showBusyCursor="true" fault="saveImageService_faultHandler(event)">
			<s:method name="saveImage" result="saveImage_resultHandler(event)"/>
		</s:RemoteObject>
3.Код php:
PHP код:
class saveimage 
{
function 
saveImage($ba)
      {
        
$file_name md5(uniqid(mt_rand(), true)); \\Формируем часть имени файла
        $data 
$ba->data; \\ByteArray в $data
            $file_name 
$file_name.".jpeg"; \\Формируем имя файла с расширением
            $file_name_tmp 
_IMAGE_TMP_ $file_name; \\Имя временного файла
            $file_name_img 
_IMAGE_LOAD_.$file_name; \\Имя полно размерного изображения
            $file_name_tmb 
_IMAGE_LOAD_TMB_.$file_name; \\Имя тумбалса
        file_put_contents
($file_name_tmp$data); \\Записываем ByteArray в файл
        $this
->imageresize($file_name_img,$file_name_tmp,_IMAGE_MAX_SIZE_,_IMAGE_QUALITY_); \\Формируем с ресайзом полно размерное изображение
        $this
->imageresize($file_name_tmb,$file_name_tmp,_IMAGE_TMB_MAX_SIZE_,_IMAGE_QUALITY_); \\Формируем тумбалс
        $this
->SaveImageData($file_name);\\Записываем имя файла в базу данных
        unlink
($file_name_tmp);\\Удаляем временный файл
        
return $this->getAllArtticleImage();
      }
      
      protected function 
imageresize ($outfile,$infile,$new_max,$quality) \\Функция ресайза файла
      
{
        
$img getimagesize ($infile);
        
$w_img $img[0];
        
$h_img $img[1];
        
$index_img $w_img/$h_img;
        if (
$index_img 1) {$neww $new_max;
                            
$newh $new_max/$index_img;}
            elseif (
$index_img 1) {$newh $new_max;
                                    
$neww $new_max*$index_img;}
                    else {
$newh $new_max;
                            
$newh $new_max;} 
        
$im imagecreatefromjpeg($infile);
        
$im_tmp imagecreatetruecolor($neww,$newh);
        
imagecopyresampled($im_tmp,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));
        
imagejpeg($im_tmp,$outfile,$quality);
        
imagedestroy($im);
        
imagedestroy($im_tmp);
        }
      
      protected function 
SaveImageData ($src_image) \\Функция записи в базу данных
      
{
        
$sql 'INSERT INTO image (image_file)
         VALUES (\''
.$src_image.'\')';
         
$result mysql_query($sql);
        }
  } 
4.Единственное, что на некоторые файлы выдает ошибку сервер AMFPHP -видимо ошибка в ресайзе.

Особое спасибо kseniya - за участие в разрешении проблемы.

Добавлено через 46 часов 8 минут
PS:Получилось даже немного лучше - меньше обмен данными при отправке на сервер, потому что первоначальный ресайз происходит на стороне клиента.
Вместо JPEGEncoder можно использовать PNGEncoder - тогда изображения на сервер будут отправляться в .png...

Добавлено через 46 часов 17 минут
Нашел ошибку - действительно в ресайзе: не учел случай равенства ширины и высоты изображения необходимо заменить if ($index_img > 1) на if ($index_img >= 1)


Последний раз редактировалось JeStas; 13.04.2011 в 00:44.
Создать новую тему Ответ Часовой пояс GMT +4, время: 01:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:32.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.