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

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

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

Регистрация: Sep 2010
Адрес: Москва
Сообщений: 21
По умолчанию сохранение gif'ок (или png)на сервере

создаю во флешке изображение, с помощью PNGEncoder (или GIFEncoder) преобразую его в ByteArray. На локальный диск спокойно сохраняется, а на сервере глухо...

Код AS3:
	var brr:ByteArray = GIFEncoder.encode(bitdata);  //bitdata - BitmapData изображения
	var request:URLRequest=new URLRequest('save.php');
	request.contentType="image/gif";
	request.data=brr;
	request.method=URLRequestMethod.POST;
	var loader:URLLoader = new URLLoader(  );
	loader.load( request );
	loader.addEventListener( Event.COMPLETE, loaderDone );
PHP код:
<?php 
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])){
    
$image $GLOBALS["HTTP_RAW_POST_DATA"];
    
$file fopen("0.gif","wb");
    
fwrite($file$image);
    
fclose($file);

?>
Подскажите, пожалуйста, в чём моя ошибка?

Старый 25.11.2010, 18:27
andrew911 вне форума Посмотреть профиль Отправить личное сообщение для andrew911 Найти все сообщения от andrew911
  № 2  
Ответить с цитированием
andrew911

Регистрация: Mar 2007
Сообщений: 545
Гугл сразу выдает "убедитесь, что в настройках PHP опция "always_populate_raw_post_data" включена."

Почему просто не задействовать массив $_POST?

А вообще алгоритм такой
1. Проверяем на сервере выполняется ли условие
if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))

если нет ищем причину

2. Смотрим содержимое переменной, если не то, что надо ищем причину

Старый 26.11.2010, 11:39
Reiver вне форума Посмотреть профиль Отправить личное сообщение для Reiver Найти все сообщения от Reiver
  № 3  
Ответить с цитированием
Reiver

Регистрация: Sep 2010
Адрес: Москва
Сообщений: 21
можно поподробнее про метод $_POST ?

в нете про загрузку файлов на сервер не нахожу ничего кроме как загрузку через браузер, через форму multipart/form-data

Старый 26.11.2010, 20:31
andrew911 вне форума Посмотреть профиль Отправить личное сообщение для andrew911 Найти все сообщения от andrew911
  № 4  
Ответить с цитированием
andrew911

Регистрация: Mar 2007
Сообщений: 545
Код AS3:
var img:ByteArray = GIFEncoder.encode(bitdata);  //bitdata - BitmapData изображения
 
var variables:URLVariables = new URLVariables();
variables.img = img;
 
var request:URLRequest=new URLRequest('save.php');
request.contentType="image/gif";
 
request.data=variables;
 
request.method=URLRequestMethod.POST;
var loader:URLLoader = new URLLoader(  );
loader.load( request );
loader.addEventListener( Event.COMPLETE, loaderDone );

PHP код:
<?php  
if (isset($_POST["img"]))

    
$image $_POST["img"]; 
    
$file fopen("0.gif","wb"); 
    
fwrite($file$image); 
    
fclose($file); 
}  
?>

Старый 26.11.2010, 20:46
Reiver вне форума Посмотреть профиль Отправить личное сообщение для Reiver Найти все сообщения от Reiver
  № 5  
Ответить с цитированием
Reiver

Регистрация: Sep 2010
Адрес: Москва
Сообщений: 21
Спасибо!

Старый 08.12.2010, 18:43
Reiver вне форума Посмотреть профиль Отправить личное сообщение для Reiver Найти все сообщения от Reiver
  № 6  
Ответить с цитированием
Reiver

Регистрация: Sep 2010
Адрес: Москва
Сообщений: 21
andrew911, сделал всё, как ты сказал.
Данные флешка отправляет (проверял локальным сохранением), эта строка
Код AS3:
loader.addEventListener( Event.COMPLETE, loaderDone );
срабатывает, функция loaderDone выполняется, но на сервере файл не создаётся, а если он есть, то не изменяется.

Почему не работает? Помогите пожалуйста.

phpinfo() выдаёт: PHP Version 5.2.12

Добавлено через 6 часов 2 минуты
сейчас попробовал добавить строки:
Код AS3:
trace(variables + " \n\n img = " + variables.img);
результат такой:

img=%C2%89PNG%0D%0A%1A%0A

img = (квадратик от юникода) PNG

(квадратик от юникода)

т.е. меняется формат данных? как сделать, что б в первом случае (отправляя variables целиком) данные из img были в том же формате?


Последний раз редактировалось Reiver; 09.12.2010 в 00:57.
Старый 09.12.2010, 18:43
andrew911 вне форума Посмотреть профиль Отправить личное сообщение для andrew911 Найти все сообщения от andrew911
  № 7  
Ответить с цитированием
andrew911

Регистрация: Mar 2007
Сообщений: 545
Выложите исходники.
Чья библиотека GIFEncoder?

Старый 10.12.2010, 03:44
Reiver вне форума Посмотреть профиль Отправить личное сообщение для Reiver Найти все сообщения от Reiver
  № 8  
Ответить с цитированием
Reiver

Регистрация: Sep 2010
Адрес: Москва
Сообщений: 21
Код AS3:
	function saveFile (event:MouseEvent):void{
.......
        var sour:DisplayObject=tload.content as DisplayObject;                      
// tloader - загрузчик картинки (её возвращает модуль mimetex - посылаешь ему формулу в Техе, он возвращает гиф-картинку)
	var bitdata:BitmapData=new BitmapData(sour.width,sour.height,true,0x00ffffff);
	var image:Bitmap=new Bitmap(bitdata);
	bitdata.draw(sour);
	var brr:ByteArray=PNGEncoder.encode(bitdata);
	var variables:URLVariables = new URLVariables();
	variables.img=brr;
 
 
	var request:URLRequest=new URLRequest('save.php');
	request.contentType="image/png";
	request.data=variables;
	request.method=URLRequestMethod.POST;
	var loader:URLLoader = new URLLoader(  );
	loader.load( request );
	loader.addEventListener( Event.COMPLETE, loaderDone )
 
	var file:FileReference = new FileReference();        //  отправляю тот же массив brr 
	file.save(variables.img,"0.gif");                   //  на локальное сохранение, и картинка сохраняется
.....
}
 
function loaderDone (event:Event):void {
	trace("ok");
}
;
функция loaderDone срабатывает, и на локальном сохранении всё работает.

фаил save.php
PHP код:
<?php  
if (isset($_POST["img"]))

    
$image $_POST["img"]; 
    
$file fopen("0.gif","wb"); 
    
fwrite($file$image); 
    
fclose($file); 
}  
?>
PNGEncoder :
Код AS3:
package
{
	import flash.geom.*;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.utils.ByteArray;
 
	public class PNGEncoder
	{
		public static function encode(img:BitmapData):ByteArray {
	        // Create output byte array
	        var png:ByteArray = new ByteArray();
	        // Write PNG signature
	        png.writeUnsignedInt(0x89504e47);
	        png.writeUnsignedInt(0x0D0A1A0A);
	        // Build IHDR chunk
	        var IHDR:ByteArray = new ByteArray();
	        IHDR.writeInt(img.width);
	        IHDR.writeInt(img.height);
	        IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA
	        IHDR.writeByte(0);
	        writeChunk(png,0x49484452,IHDR);
	        // Build IDAT chunk
	        var IDAT:ByteArray= new ByteArray();
	        for(var i:int=0;i < img.height;i++) {
	            // no filter
	            IDAT.writeByte(0);
	            var p:uint;
	            var j:int;
	            if ( !img.transparent ) {
	                for(j=0;j < img.width;j++) {
	                    p = img.getPixel(j,i);
	                    IDAT.writeUnsignedInt(
	                        uint(((p&0xFFFFFF) << 8)|0xFF));
	                }
	            } else {
	                for(j=0;j < img.width;j++) {
	                    p = img.getPixel32(j,i);
	                    IDAT.writeUnsignedInt(
	                        uint(((p&0xFFFFFF) << 8)|
	                        (p>>>24)));
	                }
	            }
	        }
	        IDAT.compress();
	        writeChunk(png,0x49444154,IDAT);
	        // Build IEND chunk
	        writeChunk(png,0x49454E44,null);
	        // return PNG
	        return png;
	    }
 
	    private static var crcTable:Array;
	    private static var crcTableComputed:Boolean = false;
 
	    private static function writeChunk(png:ByteArray, 
	            type:uint, data:ByteArray):void {
	        if (!crcTableComputed) {
	            crcTableComputed = true;
	            crcTable = [];
	            var c:uint;
	            for (var n:uint = 0; n < 256; n++) {
	                c = n;
	                for (var k:uint = 0; k < 8; k++) {
	                    if (c & 1) {
	                        c = uint(uint(0xedb88320) ^ 
	                            uint(c >>> 1));
	                    } else {
	                        c = uint(c >>> 1);
	                    }
	                }
	                crcTable[n] = c;
	            }
	        }
	        var len:uint = 0;
	        if (data != null) {
	            len = data.length;
	        }
	        png.writeUnsignedInt(len);
	        var p:uint = png.position;
	        png.writeUnsignedInt(type);
	        if ( data != null ) {
	            png.writeBytes(data);
	        }
	        var e:uint = png.position;
	        png.position = p;
	        c = 0xffffffff;
	        for (var i:int = 0; i < (e-p); i++) {
	            c = uint(crcTable[
	                (c ^ png.readUnsignedByte()) & 
	                uint(0xff)] ^ uint(c >>> 8));
	        }
	        c = uint(c^uint(0xffffffff));
	        png.position = e;
	        png.writeUnsignedInt(c);
	    }
	}
}

Старый 10.12.2010, 05:10
andrew911 вне форума Посмотреть профиль Отправить личное сообщение для andrew911 Найти все сообщения от andrew911
  № 9  
Ответить с цитированием
andrew911

Регистрация: Mar 2007
Сообщений: 545
Цитата:
Данные флешка отправляет (проверял локальным сохранением), эта строка срабатывает, функция loaderDone выполняется, но на сервере файл не создаётся, а если он есть, то не изменяется.
Скорее всего дело в разрешениях, в папку на сервере разрешена запись?
Попробуйте выставить права на папку 755 (или 777 если не поможет)

Старый 10.12.2010, 12:31
Reiver вне форума Посмотреть профиль Отправить личное сообщение для Reiver Найти все сообщения от Reiver
  № 10  
Ответить с цитированием
Reiver

Регистрация: Sep 2010
Адрес: Москва
Сообщений: 21
права на папку пробовал и 755 и 777, результат тот же.

Для сравнения: на том же сервере, в той же папке (права 755) перезаписываю файл list.xml через xmledit.php
PHP код:
<?php 
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])){
    
$xml $GLOBALS["HTTP_RAW_POST_DATA"];
    
$file fopen("list.xml","wb");
    
fwrite($file$xml);
    
fclose($file);

?>
этот код срабатывает.

Сразу возникает вопрос: а почему бы тогда такой же не использовать для сохранения картинки? А всё дело в том, что для картинки необходимо ещё передать из флешки имя данного сохраняемого файла...

Добавлено через 1 час 57 минут
Почитал по форумам, нашёл решения для jpeg (http://www.flasher.ru/forum/showthread.php?t=135894)
но в нём нет альфаканала, что мне необходимо позарез.

В общем суть вот в чём: данные картинки хранятся в ByteArray, а вот передаются они строкой, в результате чего php и не может понять, что это картинка.

в примере с жипегом байтАррей конвертируют в строку ( var jpgStream:ByteArray = jpgEncoder.encode(jpgSource); var jpgEncoded:String = encodeByteArray(jpgStream); ) после чего эту строку передают пхп и там уже декодеруют с помощью стандартного base64_decode. и тогда всё путём.

А вот для gif или png есть похожий конвертатор? я пока не могу найти...

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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