Sejak iOS 11, iPhone menggunakan format HEIC sebagai default untuk foto. Bagi developer web, ini menciptakan masalah baru: aplikasi web tidak bisa memproses file HEIC dengan mudah. Server berbasis PHP dengan GD Library tidak mendukung HEIC, sementara user iPhone terus mengupload file yang tidak kompatibel.
Masalah umum yang dihadapi:
- File HEIC ditolak oleh validasi server
- Ukuran file HEIC yang besar (3-8MB per foto)
- User confusion ketika upload gagal
- Perlu setup ImageMagick yang kompleks di server
Solusi: Client-Side Conversion dengan heic2any
Daripada menangani konversi di server, kita bisa memanfaatkan JavaScript untuk mengkonversi HEIC ke JPG di browser user sebelum upload. Solusi ini elegant karena:
- Tidak perlu instalasi library tambahan di server
- Beban processing di client, bukan server
- User experience yang seamless
- File yang sampai ke server sudah dalam format optimal
Implementasi Code
1. Setup Library
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/heic2any.min.js"></script>
2. Enhanced File Input
<input type="file" id="photo" accept="image/*,.heic,.heif" onchange="handleFileUpload(this)">
<div id="status"></div>
3. JavaScript Handler
async function handleFileUpload(input) {
if (!input.files || !input.files[0]) return;
let file = input.files[0];
const statusDiv = document.getElementById('status');
// Deteksi file HEIC
const isHeic = file.type === 'image/heic' ||
file.type === 'image/heif' ||
file.name.toLowerCase().endsWith('.heic');
if (isHeic) {
statusDiv.innerHTML = '<i class="spinner"></i> Konversi HEIC ke JPG...';
try {
// Konversi HEIC ke JPG
const convertedBlob = await heic2any({
blob: file,
toType: "image/jpeg",
quality: 0.8
});
// Buat file baru
const newFileName = file.name.replace(/\.heic$/i, '.jpg');
const newFile = new File([convertedBlob], newFileName, {
type: 'image/jpeg'
});
// Update input
const dt = new DataTransfer();
dt.items.add(newFile);
input.files = dt.files;
// Tampilkan hasil
const originalSize = (file.size / 1024 / 1024).toFixed(2);
const newSize = (newFile.size / 1024 / 1024).toFixed(2);
const savings = Math.round(((file.size - newFile.size) / file.size) * 100);
statusDiv.innerHTML = `
✅ Konversi berhasil!<br>
${originalSize}MB → ${newSize}MB (Hemat ${savings}%)
`;
} catch (error) {
statusDiv.innerHTML = '❌ Konversi gagal. Coba file lain.';
input.value = '';
}
}
}
Performance & Compatibility
Browser Support
- ✅ Chrome 57+
- ✅ Firefox 52+
- ✅ Safari 11+
- ✅ Edge 79+
- ❌ Internet Explorer (tidak didukung)
Performance Benchmark
Berdasarkan testing dengan file HEIC dari iPhone:
| Original HEIC | Converted JPG | Waktu Konversi | Penghematan |
|---|---|---|---|
| 8.2 MB | 2.8 MB | ~3 detik | 66% |
| 5.1 MB | 1.9 MB | ~2 detik | 63% |
| 3.4 MB | 1.2 MB | ~1.5 detik | 65% |
Memory Usage
- Peak memory: ~2x ukuran file original
- Untuk file 8MB, butuh ~16MB RAM sementara
- Automatic cleanup setelah konversi selesai
Best Practices
- Tambahkan Loading State: User perlu tahu proses konversi sedang berjalan
- Validation: Cek status konversi sebelum submit form
- Error Handling: Berikan alternatif jika konversi gagal
- File Size Limit: Tetap validasi ukuran file di client dan server
- Progressive Enhancement: Pastikan form tetap berfungsi tanpa JavaScript
Kesimpulan
Konversi HEIC di client-side menggunakan heic2any adalah solusi praktis untuk masalah upload iPhone photos. Implementasi ini memberikan user experience yang smooth sambil menjaga kompatibilitas server. Dengan penghematan ukuran file rata-rata 65% dan dukungan browser modern yang luas, teknik ini ready untuk production use.