Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Сохранение картинки. В Денвере работает, а на сервере - нет. (http://www.flasher.ru/forum/showthread.php?t=154946)

Kozalo 25.04.2011 17:08

Сохранение картинки. В Денвере работает, а на сервере - нет.
 
Здравствуйте! Мне нужно сохранить на сервере картинку, нарисованную в приложении. С помощью Интернета получился следующий код:
ActionScript 3.0 (Flash CS5 Portable):
Код AS3:

var pixels:Array = new Array;
var image:BitmapData = new BitmapData(w,h)// width и height указываются выше и равны 587 и 455 соответственно.
 
for (var i:uint=0; i<places.length; i++)
{
        // В массиве places хранятся нарисованные фигуры (спрайты с кругами, линиями, прямоугольниками.
        image.draw(places[i]);
        removeChild(places[i]);
}
 
for (var a:int = 0; a <= w; a++)
{
        for (var b:int = 0; b <= h; b++)
        {
                // Записываем значение цвета пикселя в 16-ричной форме
                var tmp = image.getPixel(a,b).toString(16);
                pixels.push(tmp);
        }
}
 
var request:URLRequest = new URLRequest;
request.url = serverURL;
request.method = URLRequestMethod.POST;
request.data = new URLVariables("password=" + serverPassword + "&do=createPerson&uid=" + uid + "&name=" + Edit1.text + "&force=" + String(UpDown1.value) + "&protection=" + String(UpDown2.value) + "&intelligence=" + String(UpDown3.value) + "&weapons=" + weaponsString + "&image=" + pixels.toString());
var loader:URLLoader = new URLLoader;
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, createdComplete);
loader.load(request);

PHP:
PHP код:

$data explode(","$_POST['image']);
$image imagecreatetruecolor(587455);
$i 0;
for(
$x=0$x<=587$x++)
{
    for(
$y=0$y<=455$y++)
    {
        
$int hexdec($data[$i++]);
        
$color ImageColorAllocate ($image0xCC & ($int >> 0x10), 0xCC & ($int >> 0x8), 0xCC $int);
        
imagesetpixel($image$x$y$color);
    }
}
$rr imagePNG($image$pathImage);
imagedestroy($image);
print 
"result=OK"

Проверял в Денвере, всё работало. Перенёс на хостинг (hostinger.ru) - сохраняется чёрный прямоугольник. Иногда всё-таки сохраняет нормально, но это происходит временно и случайно. Не знаю, что и делать.
Вообще, этот способ не очень хороший. Уходит слишком много трафика. Может есть какие-нибудь другие способы?
Должно получиться что-то вроде этого. А получается это.

Gaen 29.04.2011 15:09

Другой способ есть, и он вполне логичен: изображение кодируется флэшом в png или jpg, и отправляется на сервер как файл. Для кодирования используются классы PNGEncoder и JPGEncoder, которые входят в состав as3corelib.

Отправка осуществляется при помощи собранного вручную POST-запроса. Сервер, соответственно, должен обработать его как закачку файла.
Код AS3:

private function sendPNG(bmpData: BitmapData):void {        //http://www.actionscript.org/forums/showpost.php3?p=636159&postcount=4
 
        var imageBytes:ByteArray = PNGEncoder.encode(bmpData);
        imageBytes.position = 0;
 
        var boundary: String = '---------------------------7d76d1b56035e';
        var header1: String  = '--'+boundary + '\r\n'
                                                        +'Content-Disposition: form-data; name="Filename"\r\n\r\n'
                                                        +'picture.png\r\n'
                                                        +'--'+boundary + '\r\n'
                                                        +'Content-Disposition: form-data; name="Filedata"; filename="picture.png"\r\n'
                                                        +'Content-Type: application/octet-stream\r\n\r\n'
        //In a normal POST header, you'd find the image data here
        var header2: String =        '--'+boundary + '\r\n'
                                                        +'Content-Disposition: form-data; name="Upload"\r\n\r\n'
                                                        +'Submit Query\r\n'
                                                        +'--'+boundary + '--';
 
        //Encoding the two string parts of the header
        var headerBytes1: ByteArray = new ByteArray();
        headerBytes1.writeMultiByte(header1, "ascii");
 
        var headerBytes2: ByteArray = new ByteArray();
        headerBytes2.writeMultiByte(header2, "ascii");
 
        //Creating one final ByteArray
        var sendBytes: ByteArray = new ByteArray();
        sendBytes.writeBytes(headerBytes1, 0, headerBytes1.length);
        sendBytes.writeBytes(imageBytes, 0, imageBytes.length);
        sendBytes.writeBytes(headerBytes2, 0, headerBytes2.length);
 
        var request: URLRequest = new URLRequest(Config.UPLOAD_URL);
        request.data = sendBytes;
        request.method = URLRequestMethod.POST;
        request.contentType = "multipart/form-data; boundary=" + boundary;
 
        var loader:URLLoader = new URLLoader();
 
        loader.addEventListener(Event.COMPLETE, this.completeHandler);
        loader.addEventListener(IOErrorEvent.IO_ERROR, this.errorHandler);
        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, this.errorHandler);
 
        loader.load(request);
 
}//sendPNG



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

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