Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Загрузка фотографий на стену пользователя и IFRAME (http://www.flasher.ru/forum/showthread.php?t=170857)

Art_133 03.11.2011 16:27

Загрузка фотографий на стену пользователя и IFRAME
 
Привет.
Тип приложения: - iFrame.
Пытаюсь запостить фотографию на стену.
Делаю всё по инструкции:
Код:

1. С помощью метода photos.getWallUploadServer приложение узнает http-адрес для загрузки фотографии на стену текущего пользователя, другого пользователя или группы в зависимости от переданных параметров uid или gid.

2. Приложение формирует POST-запрос на полученный адрес.
Запрос должен включать поле photo, содержащее файл с изображением (JPG, PNG, BMP или GIF)

Проблема возникает на шаге 2. Когда я пытаюсь создать запрос и загрузить фотку на сервер vk:
Код:

Error #2044: Необработанный securityError:. text=Error #2048: Нарушение изолированной среды: http://some-domain.ru/flash/bin-release/Main.swf не может загрузить данные из http://cs4316.vkontakte.ru/upload.ph...=1&wallphoto=1.
        at com.social.vk::VKManager/fetchWallImageUploadServer()
        at MethodInfo-1183()
        at vk::APIConnection/apiCallback()

Логично, флеш находится вне безопасной зоны (вне домена vkontakte). Как быть, как загрузить фотографию на сервер, со стороннего, не безопасного, домена?

П.С. Если Тип приложения выставить flash (не iFrame), всё работает.

Подскажите решение для iFrame приложения.
Спасибо.

YETI_UA 06.11.2011 14:28

Нужно создать на сервере php скрипт, который будет загружать фотографию в VK

Владимир Буквин 28.12.2011 13:19

вот скрипт
PHP код:

<?php
error_reporting
(E_ALL);
$curlOptions curl_init();
curl_setopt($curlOptionsCURLOPT_URL$_POST['Filename']);
curl_setopt($curlOptionsCURLOPT_RETURNTRANSFER1);
curl_setopt($curlOptionsCURLOPT_HEADER0);
curl_setopt($curlOptionsCURLOPT_POST1);
$data = array('Filename' => 'photo.png''photo' => $_POST['photo'], 'Upload' => 'Submit Query');
curl_setopt($curlOptionsCURLOPT_POSTFIELDS$data);
$content curl_exec($curlOptions);
curl_close($curlOptions);
echo 
$content;
?>

но у меня все равно не работает. приходят данные
{"mid": "122716583", "gid": "0", "server": "10870", "photo": "", "hash": "5496f0769fe5e6002f2283668c9798c9"}
поле photo приходит пустое

Андрей911 29.12.2011 20:40

Я тоже недавно запустил приложение где флешка в iframe и была такая же проблема. Решил ее способом который уже предложен выше.
Временно переключить в настройках приложение на flash и загрузить в дополнительные swf файлы флешку, которую и вставить в iframe. Тогда исключений безопасности не возникает и фотка грузится на стену.
Правда единственное немного неудобно обновлять swf, так как не знаешь какая ссылка будет.

Владимир Буквин 29.12.2011 20:51

да - тоже решил эту проблему тем же способом. Но надо научиться делать это и с помощью php. За Iframe будущее. скоро все социальные сети могут перейти именно к этой системе

Андрей911 29.12.2011 20:57

А $_POST идет из флешки? Она же не может передавать обычным постом текст и ByteArray.
Если $_POST['photo'] в Base64, то его надо декодировать вначале, а если это ByteArray, то его нужно доставать из $GLOBALS['HTTP_RAW_POST_DATA']

http://php.net/manual/ru/reserved.va...awpostdata.php

Владимир Буквин 30.12.2011 10:09

да - не может передавать одновременно текст и картинку, - я такого способа не знаю по крайней мере.
Filename = photo.png
photo = photo.png
Upload = Submit Query

такой пост образуется при передаче данных через MultipartUrlLoader
эта часть данных в виде multipart
а так - ото все biteArray
спасибо! - ваш ответ мне оказался полезен. Будет время - поэкспериментирую


Добавлено через 8 минут
)как я передавал картинку и url по которому ее надо передать дальше?
я посылал multipart c filename = myUrl, затем на сервере заменял его на photo.png затем отправлял дальше. наверное здесь я намудрил что - то)
Еще использовал другой способ
передавал post c двумя строковыми полями -url и byteArray.
byteArray передовал символами от 0 до 9. например пробел я заменял на 032.
Затем на сервере это все декодировал обратно
этот метод мне тоже не помог)

Андрей911 30.12.2011 10:27

Вы бы попробовали у вас картинка до сервера вообще доходит?
Например разбить задачу на 2 - получить картинку из приложения и сохранить ее на сервере в файл, а потом прочитать картинку из файла и передать на контакт.

Так хоть будет понятно на каком этапе проблема возникает

Владимир Буквин 30.12.2011 12:45

До сервера доходит. Мои напарники сейчас как раз занимаются передачей картинки на сервер и сохранением ее на том же сервере. Как будет готово - сразу выложу результат здесь и ссылку на здесь там). или наоборот.

Андрей911 30.12.2011 13:26

Думаю проблема в том, что cURL посылает не multipart.

Вот нашел ссылки в интернет http://vedovini.net/2009/08/posting-...ata-using-php/
http://apptools.com/phptools/forms/forms5.php

ПС. Если получится, то поделитесь кодом. Тоже надо)))

Добавлено через 32 минуты
Вот на русском еще http://www.web-junior.net/otpravka-p...ravka-fajjlov/

Владимир Буквин 30.12.2011 17:17

спасибо за ссылки, когда найду истину, обязательно поделюсь, наверное эта тема пригодится многим)

Андрей911 13.01.2012 13:07

Владимир, привет, как успехи?

Владимир Буквин 13.01.2012 20:13

Привет, истина рядом, у меня есть скрипт, который сохраняет картинку на другой сервер, его надо переделать, чтоб он передавал картинку на сервер контакта, вместо этого. На выходных постараюсь это сделать.
Суть такая: На свой сервер кидаем даннае, используя MultipartUrlLoader, на сервере достаем данные уже не из POST, откуда не помню - что-то вроде Files - там лежат битовые данные, вот их и нужно перекинуть на сервер контакта

Добавлено через 7 минут
на сегодняшний день iframe приложение у меня может размещать фото на стену контакта, но для этого нужно, чтоб swf, загружаемый через iframe лежал на vkontakte - там можно загружать дополнительные swf файлы. Если картинку постоянная - не генерируется во flash, то можно воспользоваться другим методом jsApi - загружать на стену фотки из альбома или из группы

Владимир Буквин 10.03.2012 18:21

публикация картинки на стену vk.com
 
Я нашел ответ. на VK.com можно загрузить статические и динамические картинки. статическими называю те, которые никогда не меняются. Динамичесике - такие которые меняются, которых может быть очень много вариаций, например у меня есть домик 10 уровня из 10 и я хочу кинуть его скриншот на стену друга. Тоесть динамические - те, картинки, которых создаются в игре, затем преобразуются в картинку и кидаются на стену.
статические картинки можно разместить у себя в альбоме или в группе приложения и кидать на стену методом
Код AS3:

VK.api("wall.post", {owner_id:user_id, message:my_text, attachments:photo100172_166443618}, callbackFunction)
//attachments id вашей картинки, либо картинки из группы, любая картинка, которую можно посмотреть вконтакте

но после перехода на новый домен, с этим методом возникла проблема, перестал кидать картинку, хотя сообщение приходило на стену.
этот метод есть как в iframe, так и во flash

Затем я начал использовать функцию
Код AS3:

wall.savePost

вот ссылка на материал из vk.com
http://vk.com/developers.php?o=-1&p=wall.savePost,
она так же может использовать картинки, ранее за груженные на VK.com, либо картинки загруженные с использованием метода
Код AS3:

wall.getPhotoUploadServer

, он возвращает адрес сервера и на него можно закинуть картинку, сгенирированную в игре. кидать картинку надо не через loader, а через
Код AS3:

multipartURLLoader

, ему передается
Код AS3:

byteArray

, а он его кидает на сервер, которые вы ему указали.
в результате, после переброса картинки, сервер vk вернет данные в таком виде:
Код AS3:

{"response":{"upload_url":"http:\/\/cs9231.vkontakte.ru\/upload.php?act=do_add_posted&
mid=6492&hash=284b5d004f5524e8b781cc9ddfb75de1&rhash=5133711120e3156dbb8f4cb2069fb29f&
swfupload=1"}}

этот hash нам понадобится, его мы будем передавать в параметры функции
Код AS3:

VK.api

, использующую метод
Код AS1/AS2:

wall.savePost

.
С этим методом могут возникнуть проблемы безопасности - security error, это возникает в том случает, когда swf вашего приложения лежит не на сервере vk.com, к примеру у вас есть загрузчик лежащий на vk.com, который грузит картинку с вашего сервера.
эту проблему тоже можно обойти, но для этого нужно использовать ваш сервер на котором лежит php скрипт, которому будет передаваться картинка. ваш сервер получит картинку и сохранит ее на сервере vk.com. для php это не проблема, он не спрашивает про безопасность, в отличии от ActionScript(flash), и JavaScript.
тут будет посложнее. дело в том, что серверный скрипт должен брать данные, которые вы ему передали не из GET и не из POST переменных. на сколько я знаю, он берет эти файлы из переменной Files, но я не силен в PHP, а готового скрипта у меня нет, чтоб вам кинуть пример. Я советую, хранить приложение на сервере vk.com
Хотел написать скрипт сам, но времени нет.

RAlfDog 03.03.2013 16:03

У меня есть вот такой рабочий PHP-код с curl'ом:
PHP код:

<?php
    
if (isset($_GET['server_url'])) {
        
$fileBytes =                     $GLOBALS'HTTP_RAW_POST_DATA' ];
        
$fh =                             fopen("temp_image.png""wb");
        
fwrite($fh$fileBytes);
        
fclose($fh);
        
        
$photo['photo'] =     '@'.'temp_image.png';
        
$curl =                         curl_init(urldecode($_GET['server_url']));
        
curl_setopt($curlCURLOPT_POST1);
        
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
        
curl_setopt($curlCURLOPT_POSTFIELDS$photo);
        
$s =                             curl_exec($curl);
        
curl_close($curl);
        
        echo 
$s;
    }else {
        echo 
'{ "error_code":"-1", "error_msg":"Server is not responding." }';
    }
?>

Кто-нибудь может подсказать, как мне из него убрать этап сохранения файла на мой сервер в temp_image.png?

Sync 03.03.2013 20:27

видимо, удалив
PHP код:

$fh =                             fopen("temp_image.png""wb");
fwrite($fh$fileBytes);
fclose($fh); 



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

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