Как что-то сделать, при этом ничего не делая
Отправка файлов на сервер (допилил)
Спешу поделиться радостью (и исходниками) - новый универсальный класс Request для отправки файлов и переменных на сервер. Были пофиксены мелкие баги, немного переделана сама структура класса + добавлена возможность расширения класса под свои нужды (например - можно добавить подпись для соц. сети).
Но сначала - пример использования:
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()); } } }
Что такое MIMEType? - это класс с константами типов файлов. По умолчанию выставляется в "application/octet-stream" (какие-то бинарные данные).
Что такое File? - это класс, служащий для правильного преобразования ваших бинарных данных в поле POST-запроса (с учетом типа, имени поля и имени файла)
Как можно расширить класс? - в принципе, т.к. выложены исходники можно расширять по своему усмотрению. Однако, если говорить о "правильном" способе, то для этого предусмотрен protected метод formParamsArray, который возвращает массив параметров запроса (НЕ файлов, а именно строковых параметров). Параметры представлены экземплярами класса Parameter, который, как и класс File, нужен для правильного преобразования в обычный URLRequest. В этот массив можно добавлять свои параметры (такие как подпись запроса и т.п.). Для сортировки по имени можно использовать свойство name класса Parameter. Значение содержится в поле value. Так что, если Вы расширите класс Request до, скажем, SocialRequest, единственное, что Вам потребуется написать - это 3 строчки кода:
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; } } }
Что, нет такого класса? Ну ладно - вот примерчик =)
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 { } } }
Уфф... Ну как-то так, в общем =)
Желаю Вам приятного пользования, исходники во вложении
ЗЫ
Все кто хотел разобраться с интерфейсами - милости прошу, гляньте на исходники, там встречается использование оных в наиболее распространенной форме (обобщение типа данных)
ЗЗЫ
Все исходники содержат документацию, так что для любителей FlashDevelop и FlexBuilder - всплывающие подсказки =)
Всего комментариев 20
Комментарии
24.10.2010 21:17 | |
А речь и не идет о соц сетях - просто для примера привел как можно расширить
Цитата:
Спасибо
|
24.10.2010 22:38 | |
Цитата:
У тебя и так все это было, так что незачто =)
|
25.10.2010 00:43 | |
жуть какая. комбайн какой-то.
|
25.10.2010 01:14 | |
Посмотрим... Но смахивает на «Велосипед, или как я изобрел колесо». Изд. «Для чайников», СПб., 2010 г.
|
25.10.2010 03:24 | |
я вот не понял зачем в примере SignUtil 3жды повторяется один и тот же код. и не знал, что мой MD5 в одном случаи из 3х возвращает uppercase =)
|
25.10.2010 03:48 | |
оффтоп: да откуда ж вы берете это "случаи"
|
25.10.2010 05:28 | |
Действительно. Нужно было вынести "за скобку":
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)); У нас ресурс уважаемый. Вдруг кто такое увидит... ) |
|
Обновил(-а) i.o. 25.10.2010 в 05:32
|
25.10.2010 11:54 | |
не люблю кэйсы.
|
25.10.2010 13:33 | |
@Zebestov а как правильно?
|
25.10.2010 14:36 | |
@BlooDHounD случае
|
25.10.2010 15:20 | |
шпасиб. я ваще в русском плохо шарю. постараюсь исправится.
|
25.10.2010 17:10 | |
наверно каждый, кто что-то делал для соц сетей что-либо, напридумывал себе вот таких оберток всяческих )
|
25.10.2010 18:55 | |
Какгбе, пост совсем не про SignUtil. Но спасибо за критику =)
|
07.04.2011 21:22 | |
gloomyBrain, пытался кинуть на сервер изображение, загруженное Loader'ом и в результате получаю изображение которое не открывается ничем кроме как флешкой. Тестировал на денвере. Класс FileReference отправляет корректно и изображение сохраняется как и нужно.
Вот скрипт на сервере который сохранял изображение. PHP код:
Пытался отправить изображение по примеру пост - запроса, который в документации по классу. 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 | |
Не знаю... мне как-то лениво, сори =)
Ну я потом посмотрю, честно |
08.04.2011 21:57 | |
эх gloomyBrain, а мне так хотелось использовать Ваш класс, но буду юзать MultipartURLLoader. От безисходности. И да не знаю почему но в MultipartURLLoader отправка изображения осуществляться по примеру из документации, который в своем предыдущем сообщение разместил.
|
02.03.2012 17:32 | |
а прогресс заливки будет виден?
ато MultipartURLLoader не поддерживает progress event |
|
Обновил(-а) megapup 03.03.2012 в 13:09
|
Последние записи от gloomyBrain
- Очередной загрузчик. Часть 2. (05.12.2012)
- Очередной загрузчик. Часть 1. (04.12.2012)
- Пул объектов (31.08.2011)
- Мания чисел (08.12.2010)
- Отправка файлов на сервер (допилил) (24.10.2010)