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
?>