Estoy trabajando en un proyecto de arte generativo en el que me gustaría permitir a los usuarios guardar las imágenes resultantes de un algoritmo. La idea general es:
- Cree una imagen en un lienzo HTML5 utilizando un algoritmo generativo
- Cuando se completa la imagen, permita a los usuarios guardar el lienzo como un archivo de imagen en el servidor
- Permita al usuario descargar la imagen o agregarla a una galería de piezas producidas utilizando el algoritmo.
Sin embargo, estoy atrapado en el segundo paso. Después de un poco de ayuda de Google, encontré esta publicación de blog , que parecía ser exactamente lo que quería:
Lo que condujo al código JavaScript:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var ajax = new XMLHttpRequest();
ajax.open("POST", "testSave.php", false);
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.setRequestHeader("Content-Type", "application/upload");
ajax.send("imgData=" + canvasData);
}
y PHP correspondiente (testSave.php):
<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
$imageData = $GLOBALS['HTTP_RAW_POST_DATA'];
$filteredData = substr($imageData, strpos($imageData, ",") + 1);
$unencodedData = base64_decode($filteredData);
$fp = fopen('/path/to/file.png', 'wb');
fwrite($fp, $unencodedData);
fclose($fp);
}
?>
Pero esto no parece hacer nada en absoluto.
Más Google muestra esta publicación de blog que se basa en el tutorial anterior. No es muy diferente, pero quizás valga la pena intentarlo:
$data = $_POST['imgData'];
$file = "/path/to/file.png";
$uri = substr($data,strpos($data, ",") + 1);
file_put_contents($file, base64_decode($uri));
echo $file;
Este crea un archivo (yay) pero está dañado y no parece contener nada. También parece estar vacío (tamaño de archivo de 0).
¿Hay algo realmente obvio que estoy haciendo mal? La ruta donde estoy almacenando mi archivo es editable, por lo que no es un problema, pero parece que no está sucediendo nada y no estoy realmente seguro de cómo depurar esto.
Editar
Siguiendo el enlace de Salvidor Dali, cambié la solicitud de AJAX para que fuera:
function saveImage() {
var canvasData = canvas.toDataURL("image/png");
var xmlHttpReq = false;
if (window.XMLHttpRequest) {
ajax = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
ajax.open("POST", "testSave.php", false);
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.onreadystatechange = function() {
console.log(ajax.responseText);
}
ajax.send("imgData=" + canvasData);
}
¡Y ahora el archivo de imagen está creado y no está vacío! Parece que el tipo de contenido es importante y que cambiarlo para x-www-form-urlencoded
permitir que se envíen los datos de la imagen.
La consola devuelve la cadena (bastante grande) de código base64 y el archivo de datos es de ~ 140 kB. Sin embargo, todavía no puedo abrirlo y parece que no está formateado como una imagen.
$data
en el segundo código php), todo lo que me devuelve es una línea en blanco. ¿Por qué sería eso? Parece como si ser quizás los datos enviados no es correcto, pero parece que yo estoy enviando al igual que los ejemplos muestran ...
DataUriUpload
componente. Está documentado aquí y viene con varios medios adicionales de validación y aplicación de seguridad.
ajax.send(canvasData );
mientras la usa como me gustaajax.send("imgData="+canvasData);
. Por$GLOBALS["HTTP_RAW_POST_DATA"]
lo tanto , no será lo que espera, probablemente debería usar$_POST['imgData']
.