Bismillaahirrohmaanirrohiim…
Berikut ini cara kompress gambar sebelum diupload menggunakan javascript, tujuannya agar misalkan gambar dari HP yang ukurannya besar ini menjadi ringan saat upload.
Nah beginilah script kodenya:
<div class="mb-3">
<div class="" style="font-weight: 500;margin-bottom: .5rem;">Upload Foto/Video/File</div>
<div class="row" id="file_timeline_wrapper">
<div class="col-md-6 tr_file_timeline mb-2">
<table>
<tr>
<td style="width:30px;text-align: left;">
<i class="bi bi-x-circle-fill" style="font-size: 150%;cursor: pointer;color: red;" onclick="hapus_file_timeline(this)"></i>
</td>
<td>
<input type="file" id="id_tl_<?=getId()?>" class="form-control file_timeline" name="file_timeline[]" accept="image/*,video/*,.pdf,.doc,.docx,.xls,.xlsx" />
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="mb-3">
<button type="button" class="btn btn-sm btn-secondary" onclick="tambah_file_upload()">
<i class="bi bi-plus-circle"></i> Tambah File
</button>
</div>
<div class="mb-3">
<div id="previewFiles" class="mt-2"></div>
</div>
<span id="originalInfo"></span>
<span id="compressedInfo"></span>
Kode javascriptnya:
$(document).on("change", ".file_timeline", async function(e) {
let id_tl = $(this).attr("id");
const file = e.target.files[0];
if (!file) return;
if (!file.type.startsWith(\'image/\')) return;
$("#originalInfo").text(`Ukuran file: ${(file.size / 1024).toFixed(2)} KB`);
// kompres gambar
const compressed = await compressImage(file, 0.7, 800, 800);
const compressedUrl = URL.createObjectURL(compressed);
$("#imagePreview").attr("src", compressedUrl).removeClass("d-none");
$("#compressedInfo").text(` => compressed: ${(compressed.size / 1024).toFixed(2)} KB`);
// Ganti isi input file dengan file hasil kompres
const dataTransfer = new DataTransfer();
dataTransfer.items.add(compressed);
document.getElementById(id_tl).files = dataTransfer.files;
});
async function compressImage(file, quality = 0.7, maxWidth = 1000, maxHeight = 1000) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = event => {
const img = new Image();
img.src = event.target.result;
img.onload = () => {
// hitung rasio baru
let width = img.width;
let height = img.height;
if (width > maxWidth || height > maxHeight) {
const ratio = Math.min(maxWidth / width, maxHeight / height);
width *= ratio;
height *= ratio;
}
const canvas = document.createElement(\'canvas\');
const ctx = canvas.getContext(\'2d\');
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);
canvas.toBlob(blob => {
if (!blob) return reject(new Error(\'Gagal membuat blob\'));
const compressedFile = new File([blob], file.name, { type: blob.type });
resolve(compressedFile);
}, \'image/jpeg\', quality);
};
};
reader.onerror = err => reject(err);
});
}
function tambah_file_upload() {
const file_timeline_wrapper = $("#file_timeline_wrapper");
const new_file_timeline = file_timeline_wrapper.find(".tr_file_timeline").last().clone();
new_file_timeline.find("input").val("").attr("id", "id_tl_"+randomId());
file_timeline_wrapper.append(new_file_timeline);
}
function randomId() {
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
}
function hapus_file_timeline(element) {
if ($(".tr_file_timeline").length > 1) {
$(element).closest(".tr_file_timeline").remove();
} else {
//alert("File timeline minimal 1");
}
}
Demikian, semoga bermanfaat