SUBIR / CONVERTIR IMAGEN .HEIC EN .JPG
Para convertir .heic en .jpg tenemos que:
  1. Tener activado imagick en el php.
  2. Si lo realizamos por AJAX cargado jquery.
  3. En el AJAX es clave data: formData
El resto está explicado en el código
						
1° HTML con el form para upload, la div msg para retorno de data y img para la imagen

<body>
		<div style="text-align:center; margin:20px; padding:5px; border: solid 1px #333 ">
			<div style="text-align:left;">
				<div style="text-align:center;font-size:14px;margin-bottom:15px; ">
				CASO 1° SUBIR EL .heic y convertir a .jpg
				</div>
				<form method="post" id="formulario" enctype="multipart/form-data">
					<div style="margin-bottom:10px; ">Subir la imagen(tamaño maximo:500K valida solo .heic ) </div>
					<div> 
						<input name="archivo" type="file" accept=".heic" style="height:24px; ">
						<span id="esperando" style="visibility: hidden; ">
							<img src="esperando.gif" style="width: 16px; height:16px;"  />
						</span>
					</div>
					<div style="margin-bottom:10px; margin-top:20px; text-align:center;" id="msg"> </div>
				</form>	
			</div>
			<div style="margin-bottom:10px; margin-top:20px; text-align:left;" >
				<img src="" style="max-width: 200px;" id="subida" />
			</div>
		</div>
	</div>
</body>

2° JAVASCRIPT (JQUERY) con AJAX 

<script>
$(document).ready(function(){		
	$("input[name='archivo']").on("change", function(){		//es la forma de indicar el FILE
		var formData = new FormData($("#formulario")[0]);	//carga todos los datos del form en array
      	var ruta = "tec-php-heic-procesar.php";				//ruta del script uploader
		$("#esperando").css("visibility", "visible");		// esperando.....
		$.ajax({
			url: ruta,
			type: "POST",
			data: formData,        //datos del form declarado
			contentType: false,
			processData: false,
			success: function(dato){
				var datos = JSON.parse(dato);				// metemos la devolución AJAX en array (data no puede ser JSON)
				if(datos.devolucion!= ''){
					var texto = 'Nombre: ' + datos.devolucion + '</br>';
					texto += 'Fecha: '+ datos.fecha + '</br>';
					texto += 'Dimensiones: '+ datos.ancho + ' x ' + datos.alto + '</br>';
					texto += 'Tamaño: '+ datos.peso + '</br>';
					$("#msg").html(texto);								//mando los datos del archivo subido y cambiado
					$("#esperando").css("visibility", "hidden");		//desaparece esperando....
					$("#subida").attr('src', datos.ruta);				//le cambio el src al de la imagen subida
				}else{
					$("#esperando").css("visibility", "hidden");		//desaparece esperando....
					$("#msg").html('Ha ocurrido un error');				//envío el mensaje de error
				}
            } //fin success	
        }); // fin ajax
	});  // fin on change 
});	// fin ready.			   
</script>

3° SCRIPT (PHP)

<?php 
// funciones necesarias********************************
	date_default_timezone_set('America/Argentina/Buenos_Aires');  //o agrega hora UTC huso cero
	function nombrecopia($arch){
		$a= getdate();										//array asociativo con los elementos de fecha y hora
		$me = str_pad($a['mon'],2,'0',STR_PAD_LEFT);		// mes ajustado a dos dígitos padeado con ceros a la izq.
		$di = str_pad($a['mday'],2,'0',STR_PAD_LEFT);		//idem día
		$ho = str_pad($a['hours'],2,'0',STR_PAD_LEFT);		//idem hora
		$mi = str_pad($a['minutes'],2,'0',STR_PAD_LEFT);	//idem minutos
		$se = str_pad($a['seconds'],2,'0',STR_PAD_LEFT);	//idem segundos
		return substr($arch, 0, strrpos($arch,'.')) . "-copia-" . $a['year']. "-". $me."-".$di."_".$ho.$mi.$se. substr($arch, strrpos($arch,'.'));
	}
	function extension($archivo){
		return substr($archivo,strrpos($archivo,'.') + 1);		//busca último punto +1 y corta de ahí hasta final
	}
	function raiz($archivo){
		return substr($archivo,0,strrpos($archivo,'.'));		// corta desde principio hasta último punto
	}
	 function peso($peso){
		if ($peso<1024){
			return $peso . " B";
		}else if($peso>1024 && $peso<1048576){
			return round($peso/1024,1 ). " KB";
		}else if($peso>1048576 && $peso<1073741824){
			return round($peso/1048576,2 ). " MB";
		}else{
			return round($peso/1073741824,2 ). " GB";
		}
	}
// FIN funciones*************************************

if (isset($_FILES["archivo"])){   							// si viene algo del form
	$file = $_FILES["archivo"];   							//cargo en $file la info
	$nombre = $file["name"];								//nombre original subido
	$ruta_provisional = $file["tmp_name"];  				//ruta temporaria en server
	$ruta = "img-dropzone/";								// ruta final 
	$extension = extension($nombre);						// extensión del archivo
	$raiznombre = raiz($nombre);							// raiz del nombre del archivo
	$im = new Imagick();									//creo el objeto imagick
	$im->readImage($ruta_provisional);					// grabo la imagen desde el temporal
	if ($extension =='HEIC' || $extension=='heic'){			// si es heic
		$im->setImageFormat('jpeg');						// le cambio el formato a jpg
		$nombre = $raiznombre . '.jpg';						// le cambio la extensión en el nombre
	}
	if(file_exists($ruta. $nombre)){						//si ya hay imagen con ese nombre se lo cambio
		$nombre = nombrecopia($nombre);
	}
	$ruta_final= $ruta. $nombre;
	$im->writeImage($ruta_final);						// grabo en el disco la imagen grande
		//data para pasar por JSON, no son mandatorios
	$ancho = $im->getImageWidth();						//obtengo ancho 
	$alto = $im->getImageHeight();						//obtengo alto 
	$im->clear();										// destruyo objeto y libero memoria
	$peso = peso(filesize($ruta_final));					//tamaño en Bytes peso(paso a string con B, KB, MB, GB)
	$fecha = date("d/m/Y", filectime($ruta_final));			// fecha de última modificación de inode (o sea upload en este caso)
	$resultado=array("devolucion"=>$nombre,"ruta"=>$ruta_final,"ancho"=>$ancho,"alto"=>$alto,"peso"=>$peso,"fecha"=>$fecha);
	echo(json_encode($resultado));
}// fin if (is set) si viene algo del form

?>												
						
					
© IQSystems 2023