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

Вернуться   Форум Flasher.ru > Блоги > Автокомплит

Как что-то сделать, при этом ничего не делая
Рейтинг: 3.67. Голосов: 3.

Отправка файлов на сервер (допилил)

Запись от gloomyBrain размещена 24.10.2010 в 20:45
Обновил(-а) gloomyBrain 12.12.2010 в 20:42

Спешу поделиться радостью (и исходниками) - новый универсальный класс Request для отправки файлов и переменных на сервер. Были пофиксены мелкие баги, немного переделана сама структура класса + добавлена возможность расширения класса под свои нужды (например - можно добавить подпись для соц. сети).
Но сначала - пример использования:
Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.net.URLLoader;
	import flash.utils.ByteArray;
	import net.request.field.File;
	import net.request.field.MIMEType;
	import net.request.Request;
 
	/**
	 * ...
	 * @author gloomybrain
	 */
	public class Main extends Sprite {
 
		private var _loader:URLLoader = new URLLoader();
 
		public function Main():void {
 
			super();
 
			// готовим параметры для запроса
			var params:Object = {
				method: "friends.get",
				uid: "gloomybrain",
				имя_параметра: "значение параметра"
			};
 
			// создаем сам запрос и передаем в него параметры
			var request:Request = new Request("http://site.ru", params);
 
			// после создания самого запроса
			// можно добавить параметры вот так:
			request.parameters["имя_параметра"] = "значение_параметра";
 
			// Если хотим добавить файл - делаем это
			// легко и просто - в два хода:
			// сначала приготовим файл
			var data:ByteArray = ...; // тут наши данные для передачи
			var file:File = new File("имя поля запроса", data, "image.jpg", MIMEType.IMAGE_JPEG);
 
			// теперь добавим файл к запросу
			request.files.push(file);
 
			// осталось только отправить это все на сервер
			// для этого нужно преобразовать наш Request
			// в стандартный URLRequest
			_loader.load(request.toURLRequest());
 
		}
 
	}
 
}
Данные можно отправлять как GET, так и POST запросом (в случае с GET файлы не могут быть переданы). Количество файлов и переменных ничем не ограничено (можно одновременно несколько файлов и переменных)

Что такое MIMEType? - это класс с константами типов файлов. По умолчанию выставляется в "application/octet-stream" (какие-то бинарные данные).

Что такое File? - это класс, служащий для правильного преобразования ваших бинарных данных в поле POST-запроса (с учетом типа, имени поля и имени файла)

Как можно расширить класс? - в принципе, т.к. выложены исходники можно расширять по своему усмотрению. Однако, если говорить о "правильном" способе, то для этого предусмотрен protected метод formParamsArray, который возвращает массив параметров запроса (НЕ файлов, а именно строковых параметров). Параметры представлены экземплярами класса Parameter, который, как и класс File, нужен для правильного преобразования в обычный URLRequest. В этот массив можно добавлять свои параметры (такие как подпись запроса и т.п.). Для сортировки по имени можно использовать свойство name класса Parameter. Значение содержится в поле value. Так что, если Вы расширите класс Request до, скажем, SocialRequest, единственное, что Вам потребуется написать - это 3 строчки кода:
Код AS3:
package social.net.request {
 
	import flash.net.URLRequestMethod;
	import net.request.Request;
	import social.IFrame;
 
	/**
	 * ...
	 * @author gloomybrain
	 */
 
	/*
	 * Класс для формирования сетевых запросов к API социальных сетей
	 * 
	 * @param params Параметры запроса в виде объекта (пары имя-значение)
	 * 
	 * @param method Метод запроса, по умолчанию POST (используются константы класса flash.net.URLRequestMethod)
	 */
	public class SocialRequest extends Request {
 
		public function SocialRequest(url:String, params:Object = null, method:String = "POST") {
 
			super(url, params, method);
 
		}
 
		override protected function formParamsArray():Array/*of Parameter*/{
 
			var paramsArray:Array/*of Parameter*/= super.formParamsArray();
 
			SignUtil.signSocial(paramsArray);
 
			return paramsArray;
		}
 
	}
 
}
В данном случае предполагается, что у Вас уже есть некий класс SignUtil, который умеет правильно подписывать запросы.

Что, нет такого класса? Ну ладно - вот примерчик =)
Код AS3:
package social.net.request {
 
	import by.blooddy.crypto.MD5;
	import net.request.field.Parameter;
	import social.SocialNetwork;
	import social.IFrame;
 
	/**
	 * ...
	 * @author gloomyBrain
	 * @mail CartoonRaccoon@gmail.com
	 */
 
	public final class SignUtil {
 
		/*
		 * Добавляет подпись для социальной сети в массив параметров
		 */
		public static function signSocial(paramsArray:Array/*of Parameter*/):void {
 
			var i:int = 0;
			var len:int = 0;
			var sig:String = "";
 
			switch (IFrame.social_network) {
 
				case SocialNetwork.VKONTAKTE:
 
					paramsArray.push(new Parameter("api_id", IFrame.app_id));
					paramsArray.push(new Parameter("v", "3.0"));
					paramsArray.sortOn("name");
 
					sig = IFrame.viewer_id;
 
					len = paramsArray.length;
					for (i = 0; i < len; i++) {
						sig += paramsArray[i].name + "=" + paramsArray[i].value;
					}
 
					sig += IFrame.api_secret;
					sig = MD5.hash(sig);
 
					paramsArray.push(new Parameter("sig", sig));
					paramsArray.push(new Parameter("sid", IFrame.sess_id));
 
				break;
 
				case SocialNetwork.MAIL:
 
					paramsArray.push(new Parameter("app_id", IFrame.app_id));
					paramsArray.push(new Parameter("session_key", IFrame.sess_id));
					paramsArray.sortOn("name");
 
					sig = IFrame.viewer_id;
 
					len = paramsArray.length;
					for (i = 0; i < len; i++) {
						sig += paramsArray[i].name + "=" + paramsArray[i].value;
					}
 
					sig += IFrame.api_secret;
					sig = MD5.hash(sig);
 
					paramsArray.push(new Parameter("sig", sig));
 
				break;
 
				case SocialNetwork.ODNOKLASSNIKI:
 
					paramsArray.push(new Parameter("application_key", IFrame.app_id));
					paramsArray.push(new Parameter("session_key", IFrame.sess_id));
					paramsArray.sortOn("name");
 
					len = paramsArray.length;
					for (i = 0; i < len; i++) {
						sig += paramsArray[i].name + "=" + paramsArray[i].value;
					}
 
					sig += IFrame.api_secret;
					sig = MD5.hash(sig).toLowerCase();
 
					paramsArray.push(new Parameter("sig", sig));
 
				break;
 
			}
 
		}
 
		/*
		 * Добавляет подпись для внутренних обращений в массив параметров
		 */
		public static function signInternal(paramsArray:Array/*of Parameter*/):void {
 
		}
 
	}
 
}
Честно говоря, было лень переписывать с существующего формата на некий универсальный, по этому, при желании, просто замените всякие там IFrame.app_id на нужные параметры (как правило, они передаются во flashvars или в параметрах GET-запроса к IFrame приложению)

Уфф... Ну как-то так, в общем =)
Желаю Вам приятного пользования, исходники во вложении

ЗЫ
Все кто хотел разобраться с интерфейсами - милости прошу, гляньте на исходники, там встречается использование оных в наиболее распространенной форме (обобщение типа данных)

ЗЗЫ
Все исходники содержат документацию, так что для любителей FlashDevelop и FlexBuilder - всплывающие подсказки =)
Вложения
Тип файла: zip request.zip (5.8 Кб, 229 просмотров)
Размещено в flash.net
Комментарии 20 Отправить другу ссылку на эту запись
Всего комментариев 20

Комментарии

Старый 24.10.2010 21:13 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Я когда прочитал - совсем не понял, о каких подписях речь и всё такое.
Не хватает вступления, что речь идёт о социальных сетях.

В целом - респект большой. Наверное, в скором времени буду у себя использовать. Спасибо.
Старый 24.10.2010 21:17 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
А речь и не идет о соц сетях - просто для примера привел как можно расширить

Цитата:
Спасибо
У тебя и так все это было, так что незачто =)
Старый 24.10.2010 22:38 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
У тебя и так все это было, так что незачто =)
Имеешь ввиду что уже присылал? Разве здесь она не допилена чуть больше? )
Старый 25.10.2010 00:43 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
жуть какая. комбайн какой-то.
Старый 25.10.2010 01:14 dimarik вне форума
dimarik
 
Аватар для dimarik
Посмотрим... Но смахивает на «Велосипед, или как я изобрел колесо». Изд. «Для чайников», СПб., 2010 г.
Старый 25.10.2010 03:24 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
я вот не понял зачем в примере SignUtil 3жды повторяется один и тот же код. и не знал, что мой MD5 в одном случаи из 3х возвращает uppercase =)
Старый 25.10.2010 03:48 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
оффтоп: да откуда ж вы берете это "случаи"
Старый 25.10.2010 05:28 i.o. вне форума
i.o.
 
Аватар для i.o.
Действительно. Нужно было вынести "за скобку":

Код AS3:
paramsArray.push(new Parameter( .... ));
paramsArray.push(new Parameter( .... ));
paramsArray.sortOn("name");
 
sig = IFrame.viewer_id;
 
len = paramsArray.length;
for (i = 0; i < len; i++) {
    sig += paramsArray[i].name + "=" + paramsArray[i].value;
}
 
sig += IFrame.api_secret;
sig = MD5.hash(sig);
 
paramsArray.push(new Parameter("sig", sig));
А в свитче менять только 2 new Parameter() и подставлять их через переменные.

У нас ресурс уважаемый. Вдруг кто такое увидит... )
Обновил(-а) i.o. 25.10.2010 в 05:32
Старый 25.10.2010 11:54 Котяра вне форума
Котяра
 
Аватар для Котяра
не люблю кэйсы.
Старый 25.10.2010 13:33 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
@Zebestov а как правильно?
Старый 25.10.2010 14:36 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
@BlooDHounD случае
Старый 25.10.2010 15:20 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
шпасиб. я ваще в русском плохо шарю. постараюсь исправится.
Старый 25.10.2010 17:10 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
наверно каждый, кто что-то делал для соц сетей что-либо, напридумывал себе вот таких оберток всяческих )
Старый 25.10.2010 18:55 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Какгбе, пост совсем не про SignUtil. Но спасибо за критику =)
Старый 07.04.2011 21:22 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
gloomyBrain, пытался кинуть на сервер изображение, загруженное Loader'ом и в результате получаю изображение которое не открывается ничем кроме как флешкой. Тестировал на денвере. Класс FileReference отправляет корректно и изображение сохраняется как и нужно.
Вот скрипт на сервере который сохранял изображение.
PHP код:
<?php 
    $file_temp
=$_FILES['file1']['tmp_name']; 
    
$file_name=$_FILES['file1']['name']; 
    
$file_path=$_SERVER['DOCUMENT_ROOT']."/loader_image/images";        
     
    if(!
file_exists($file_path."/".$file_name)) { 
        
$filestatus move_uploaded_file($file_temp ,$file_path."/".$file_name); 
        
$file fopen$file_path.'/'.'log.txt'"w+" );
        
fwrite$file'--'.$_SERVER['HTTP_ACCEPT'].'--'."\n".'--'.$_SERVER['HTTP_HOST'].'--'."\n".'--'.$_SERVER['HTTP_USER_AGENT'].'--'."\n" ) ;
        
fwrite$file'--'.$_SERVER['REQUEST_METHOD'].'--'."\n" ) ;  
        
fwrite$file'--'.$_SERVER['CONTENT_TYPE'].'--'."\n" ) ;  
        
fwrite$file'--'.$_SERVER['CONTENT_LENGTH'].'--'."\n" ) ; 
        
fwrite$file'--'.$_SERVER['HTTP_FROM'].'--'."\n" ) ; 
        
        
fclose$file );

        if ( !
$filestatus ) { 
            echo(
'Произошла ошибка при передаче!');            
        } else {
            echo(
"Изображение сохранено!");
         
        }
    } 
?>
Ничего особенного тут нет. Еще вывел заголовки в log.txt что бы посмотреть как FileReference их пишет, к сожалению ничего полезного так и не узнал.
Пытался отправить изображение по примеру пост - запроса, который в документации по классу.
Код AS3:
POST /handler.cfm HTTP/1.1 
  Accept: text/*
  Content-Type: multipart/form-data; 
  boundary=----------Ij5ae0ae0KM7GI3KM7 
  User-Agent: Shockwave Flash 
  Host: www.example.com 
  Content-Length: 421 
  Connection: Keep-Alive 
  Cache-Control: no-cache
 
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Filename"
 
  MyFile.jpg
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Filedata"; filename="MyFile.jpg"
  Content-Type: application/octet-stream
 
  FileDataHere
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Upload"
 
  Submit Query
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--
Тот же результат.

Так вот в чем быть может ошибка то?
Старый 08.04.2011 21:20 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Не знаю... мне как-то лениво, сори =)
Ну я потом посмотрю, честно
Старый 08.04.2011 21:57 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
эх gloomyBrain, а мне так хотелось использовать Ваш класс, но буду юзать MultipartURLLoader. От безисходности. И да не знаю почему но в MultipartURLLoader отправка изображения осуществляться по примеру из документации, который в своем предыдущем сообщение разместил.
Старый 30.08.2011 23:17 a7z вне форума
a7z
Спасибо за класс! Очень пригодился. Мало понимаю, как он работает =), но работает отлично!
з.ы.
Может кому понадобиться. Была проблема отправки, не хотела отправляться информация при работе флэшки с сайта. Как я понял проблема в настройках безопасности. Решилось заменой
Код AS3:
result.contentType = "multipart/form-data; boundary=\"" + boundary + "\"";
на
Код AS3:
result.requestHeaders.push(new URLRequestHeader("Content-type", "multipart/form-data; boundary=\"" + boundary + "\""));
Старый 31.08.2011 00:03 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
По идее, ограничение накладывается на отправку без действия пользователя. То есть, если Вы отправляете запрос в обработчике клика / нажатия клавиши, либо в любой функции, вызываемой в этом обработчике - то никаких проблем не будет (вроде как, пользователь сам подтверждает отправку, наивно полагает Adobe).
Если честно, я в курсе того, как это обходится, просто принципиально не стал делать через заголовок, дабы оно не сломалось в новых версиях FP.
Старый 02.03.2012 17:32 megapup вне форума
megapup
а прогресс заливки будет виден?
ато MultipartURLLoader не поддерживает progress event
Обновил(-а) megapup 03.03.2012 в 13:09
 

 


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


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