Hilfe gesucht zum Schreiben eines Media Files (IPS_SetMediaContent)

Ich bräuchte einmal Hilfe beim Schreiben eines Media Files. Ich möchte gerne ein Media File mit einem Bild erzeugen.

Mein Bild liegt base64 kodiert vor

const EINS = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7KoorjvjHrnirw54A1HWfB+k2Op6jaxtK0d5P5cccSozPJ/tEYHy5Gc9aAOxorg/2f/FOq+Nfg/4e8Ua2YDqGoQPJMYY9iZErqMLk44UV3lABWN440651fwXrmlWYQ3N7p1xbw722rveJlXJ7DJHNbNFAHCfADwtqvgr4P+HvC+tiAahp8DxzeTJvTJldhhsDPDCu7oooA//Z';

Gibt man den String in eine Browserzeile ein, dann wird das Bild auch angezeigt:

Aber wenn ich im Skript versuche, das Bild einem Media-File zuzuordnen, dann gelingt es nicht. Das File wird zwar angelegt, aber die Länge ist 0. Auch wird es weder in der Konsole noch in der Visu angezeigt.

Dies ist mein Testscript:

<?php
/**
 * genutzte globale Variablen:
 * @var array $_IPS
 */
declare(strict_types=1);

const EINS = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7KoorjvjHrnirw54A1HWfB+k2Op6jaxtK0d5P5cccSozPJ/tEYHy5Gc9aAOxorg/2f/FOq+Nfg/4e8Ua2YDqGoQPJMYY9iZErqMLk44UV3lABWN440651fwXrmlWYQ3N7p1xbw722rveJlXJ7DJHNbNFAHCfADwtqvgr4P+HvC+tiAahp8DxzeTJvTJldhhsDPDCu7oooA//Z';

$mediaId = IPS_CreateMedia(MEDIATYPE_IMAGE); // Image im MedienPool anlegen
IPS_SetMediaCached($mediaId, false);
IPS_SetName($mediaId, 'Media');
IPS_SetParent($mediaId, $_IPS['SELF']);
IPS_SetIdent($mediaId, 'Media');
var_dump(IPS_SetMediaFile($mediaId, '/media/TestMedia.jpg', false));
var_dump(IPS_SetMediaContent($mediaId, EINS));

Als Ausgabe kommt

bool(true)
bool(true)

Da bin ich momentan ratlos. Ich vermute, beim IPS_SetMediaContent läuft etwas schief, obwohl der Return true ist.

Geht bei mir mit

IPS_SetMediaContent($MedienID, base64_encode($RawData));

Siehe: UnifiProtect/UnifiProtectDevice/module.php at main · bgersmann/UnifiProtect · GitHub

1 „Gefällt mir“

So mache ich es auch :wink:

       if (!IPS_MediaExists($mediaID)) {
            $mediaID = IPS_CreateMedia(1);
            IPS_SetParent($mediaID, $this->InstanceID);
            IPS_SetIdent($mediaID, $ident);
            IPS_SetMediaCached($mediaID, $cache);
            // Connect to file
            IPS_SetMediaFile($mediaID, $file, false);
            IPS_SetName($mediaID, $name);
            // Copy to media variable
            IPS_SetMediaContent($mediaID, base64_encode($response));
            IPS_SendMediaEvent($mediaID);
       }

Danke für eure Unterstützung. Ich habe es jetzt gefunden. Der „Vorspann“ musste noch weg. So ist es richtig:

const EINS = '/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7KoorjvjHrnirw54A1HWfB+k2Op6jaxtK0d5P5cccSozPJ/tEYHy5Gc9aAOxorg/2f/FOq+Nfg/4e8Ua2YDqGoQPJMYY9iZErqMLk44UV3lABWN440651fwXrmlWYQ3N7p1xbw722rveJlXJ7DJHNbNFAHCfADwtqvgr4P+HvC+tiAahp8DxzeTJvTJldhhsDPDCu7oooA//Z';

Zu dumm nur, dass IPS_SetMediaContent keine Warnung ausgibt und auch nicht false zurückgibt, wenn etwas schiefläuft. Somit war es eine harte Nuss :frowning: @paresy: könnte das nicht vielleicht verbessert werden?

Dann aber ohne base64_encode bei IPS_SetMediaContent! Weil sonst doppelt gemoppelt :smiley: