Autor Zpráva
sml
Profil *
Dobry den, chtel bych se zeptat, jak pomoci PHP ulozit obrazek z Flash Builderu 4.

Mam takovy to kod (FB4):

var picture:BitmapData = new BitmapData(theCam.width, theCam.height);
picture.draw(theCam);
var jPEGEncoder:JPEGEncoder = new JPEGEncoder(500);
var imageSnapshot:ImageSnapshot = ImageSnapshot.captureImage(theCam, 0, jPEGEncoder);

var obr:String = ImageSnapshot.encodeImageAsBase64(imageSnapshot);

var encodedData:String = obr;

var handleService:HTTPService = new HTTPService(); 
handleService.url = "/saveFile.php"
handleService.method = "POST";
handleService.showBusyCursor = true;
handleService.send({content: encodedData});

A soubor na ukladani (PHP):

<?php
 
    $file_data = $_POST['content'];
    $img_data = base64_decode($file_data);
    $img_filename = "example_name.jpg";
    $fp = fopen ($img_filename, "w");
    fwrite ($fp, $img_data);
    fclose ($fp); 
?>


Chyby mi to zadne nehlasi, avsak kod nefunguje, nic se nedeje. Mohl by mi nekdo poradit co s tim? Dekuji.

Moderátor Alphard: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Alphard
Profil
PHP část lze zkrátit, ale chybu v tom nevidím.
<?php
file_put_contents('example_name.jpg', base64_decode($_POST['content']));

Pro testování, jaká data script přijme (předpokládám, že jinak to nevidíte) lze použít
<?php
file_put_contents(time().'.log', print_r($_POST, true));

Flash neznám.

Doplnil jsem počáteční <?php, aby nedošlo ke zmatení.
sml
Profil *
Dekuji za radu. Zatim to ale vypada, ze chyba bude nekde ve Flashovem kodu, protoze pri pouziti
file_put_contents(time().'.log', print_r($_POST, true));

se zadny log nevytvori, tedy php skript se vubec nepusti.
Alphard
Profil
[#3] sml
Omlouvám se, jestli jsem vás zmátl, ale <?php musí zůstat, v PHP kategorii to beru jako samozřejmost, ale tady to radši zdůrazním :-). Svůj původní příspěvek jsem upravil.
:D
Profil *
Je třída JPEGEncoder od Adobe? A opravdu JPEGEncoder požaduje kvalitu obrázku 500%?
weroro
Profil
:D:
JPEGEncoder je zrejme nejaká trieda (súdim podla toho ako je vytvorený samotný objekt). Tá 500 je tam ale skutočne divná a logicky to môže byť len kvalita, aj keď nie je vylúčené, že sa jedná o iný parameter.
:D
Profil *
weroro:
Na třídu JPEGEncoder jsem se ptal jest-li je od Adobe, protože mi připadá, že dotyčný to dělá podle tohoto článku http://www.adobe.com/devnet/flash/articles/saving_flash_graphics.html kde je tato třída použita a mohlo by to signalizovat onen problém.

Jinak to jsem to dělal takto:
AS
Main.as
package {
	
	import com.Snapshot;
	import fl.controls.Button;
	import fl.controls.TextInput;
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	public class Main extends Sprite {
		
		private var container:Sprite;
		private var textInput:TextInput;
		private var buttonCapture:Button;
		
		public function Main() {
			
			container = new Sprite();
			container.x = 20; 
			container.y = 20;
			this.addChild(container);
			
			textInput = new TextInput();
			textInput.setSize((this.stage.stageWidth / 2) - 40, this.stage.stageHeight - 60);
			container.addChild(textInput);
			
			buttonCapture = new Button();
			buttonCapture.label = "zachytit obraz";
			buttonCapture.x = (this.stage.stageWidth - buttonCapture.width) / 2;
			buttonCapture.y = this.stage.stageHeight - 30;
			this.addChild(buttonCapture);
			
			buttonCapture.addEventListener(MouseEvent.CLICK, onCapture);
			
		}
		
		private function onCapture(thisEvtent:MouseEvent):void {
			Snapshot.capture(textInput);
			
			var bitmap:Bitmap = Snapshot.copy;
			bitmap.x = (this.stage.stageWidth / 2) + 20;
			bitmap.y = 20;
			this.addChild(bitmap);
		}
		
	}
	
}


Snapshot.as
package com {
	
	import com.adobe.images.JPGEncoder;
	import com.util.Base64;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.geom.Rectangle;
	import flash.net.navigateToURL;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.net.URLVariables;
	import flash.utils.ByteArray;
	

	public class Snapshot {
		
		public static var copy:Bitmap;
		
		public function Snapshot() {
			//...
		}
		
		public static function capture(target:DisplayObject):void {
			
			var rectangle:Rectangle = target.getBounds(target.parent);
			
			var bitmapData:BitmapData = new BitmapData(rectangle.width + 2, rectangle.height + 2);
			
			bitmapData.draw(target.parent);
			
			copy = new Bitmap(bitmapData);			
			
			var byteArray:ByteArray;
			
			// encode as JPG
			var jpgEncoder:JPGEncoder = new JPGEncoder(80);
			byteArray = jpgEncoder.encode(bitmapData);
			
			var byteArrayAsString:String = Base64.encodeByteArray(byteArray);			
			
			var url:String = "saveImage.php" + '?' + Math.random();			
			var fileName:String = "img001.jpg"
			
			var urlRequest:URLRequest = new URLRequest(url);
			urlRequest.method = URLRequestMethod.POST;
			
			var urlVariables:URLVariables = new URLVariables();
			urlVariables.fileName = fileName;
			urlVariables.image = byteArrayAsString;
			urlRequest.data = urlVariables;
			
			var urlLoader:URLLoader = new URLLoader();			
			urlLoader.load(urlRequest);			
			
		}
		
		
	}
	
}


Třídy JPGEncoder a Base64 používám z uvedeného článku.

PHP:
<?php
// vytvori promennou fileName, ktera obsahuje nazev obrazku (zaslanou Flashem pomoci metody POST)
$fileName = $_POST['fileName'];
// prevede retezec, ktery je zakodovan pomoci base64 na do puvodniho tvaru (v tomto pripade je to obrazek JPG)
$image = base64_decode($_POST["image"]);
// uklada soubor na server
file_put_contents($fileName, $image);
// vraci obrazk zpet Flashi
echo $image;
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0