Aquí está la matriz que funciona cuando la envío a mi servidor PHP. Las imágenes no están comprimidas en esta matriz.
Array ( [name] => Array ( [0] => IMG_3272.jpg ) [type] => Array ( [0] => image/jpeg ) [tmp_name] => Array ( [0] => C:\xampp\tmp\phpE857.tmp ) [error] => Array ( [0] => 0 ) [size] => Array ( [0] => 2267094 ) )A continuación se muestra la matriz que no funciona. En este punto las imágenes están comprimidas.
Array ( [name] => Array ( [0] => IMG_3270.jpg ) [type] => Array ( [0] => img/jpg ) [tmp_name] => Array ( [0] => C:\xampp\tmp\php4129.tmp ) [error] => Array ( [0] => 0 ) [size] => Array ( [0] => 12 ) )Envié con éxito el correo electrónico con los archivos adjuntos de imagen. Sin embargo, cuando recibo el correo electrónico e intento abrirlo, aparece el error "Parece que no admitimos este formato de archivo".
Cuando las imágenes no están comprimidas, los archivos adjuntos a los correos electrónicos son visibles.
Esta es la función que se supone que comprime las imágenes y las agrega a una entrada oculta en el formulario HTML.
async function handleImageUpload() { var fileUpload = document.getElementById("fileUpload"); const options = { maxSizeMB: 1, maxWidthOrHeight: 1920, useWebWorker: true } const compressedImages = []; for(let i = 0; i < fileUpload.files.length; i++){ const imageFile = fileUpload.files[i]; try { const compressedFile = await imageCompression(imageFile, options); compressedImages.push(compressedFile) // await uploadToServer(compressedFile); // write your own logic } catch (error) { console.log(error); } } var fileUploads = document.getElementById("fileUploads"); const dataTransfer = new DataTransfer(); const file = new File([compressedImages[0]['name']], compressedImages[0]['name'], {type: 'img/jpg'}) dataTransfer.items.add(file); fileUploads.files = dataTransfer.files; console.log(fileUploads.files) }La razón de todo esto se debe a la lógica funky que ocurre en el backend. Por alguna razón, cuando obtengo una matriz Img de cerca de 6 mb, se envían múltiples correos electrónicos.
Aquí está el código PHP relevante. En una ruta de solicitud posterior
$files = $_FILES['uploaded_files']; print_r($files); die(); ``Para cualquiera que se encuentre con esta publicación.
Tenga en cuenta que el objetivo final es tener varios archivos comprimidos. En este momento puedo comprimir solo un archivo. Creo que podré hacer esto en varios archivos a través de un bucle for.
javascript front-end--
async function handleImageUpload() { var fileUpload = document.getElementById("fileUpload"); const options = { maxSizeMB: 1, maxWidthOrHeight: 1920, useWebWorker: true } const compressedImages = []; for(let i = 0; i < fileUpload.files.length; i++){ const imageFile = fileUpload.files[i]; try { console.log(imageFile) const compressedFile = await imageCompression(imageFile, options); compressedImages.push(compressedFile) console.log(compressedImages[0]) } catch (error) { console.log(error); } } //This is a hidden input in the html document. This is what will be sent to the server. var fileUploads = document.getElementById("fileUploads"); const dataTransfer = new DataTransfer(); const file = new File([compressedImages[0]], 'Hello_world.jpg',{type:"image/jpeg"}) dataTransfer.items.add(file); fileUploads.files = dataTransfer.files; console.log(fileUploads.files) }Usé este paquete npm a través de CDN https://www.npmjs.com/package/browser-image-compression