๐Ÿ–ผ๏ธ ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•ด๋ณด๊ธฐ

๋ฐ•ํฌ์ˆ˜ยท2023๋…„ 11์›” 14์ผ
0

๐Ÿ‘ฉโ€๐Ÿ’ป ์‚ฌ์šฉ ๋ฐฐ๊ฒฝ

์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ์‹œํ‚ค๋Š” ๊ณผ์ • ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ? ํ•˜๋Š” ์ƒ๊ฐ์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

โœ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ : browser-image-compression

broser-image-compression์€ ์ด๋ฏธ์ง€ ์••์ถ•์„ ์œ„ํ•ด ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” javascript ๋ชจ๋“ˆ์ด๋‹ค. ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์žฅ ๋งŽ์•˜๊ณ , ์ •๋ณด๊ฐ€ ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

โญ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์‚ฌ์šฉ๋ฒ•์€ ์–ด๋ ต์ง€ ์•Š๋‹ค. ์šฐ์„ , ๊ณต์‹ ์‚ฌ์ดํŠธ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ณด์ž!

// ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๋“ฑ๋กํ•˜๋Š” input ์ปดํฌ๋„ŒํŠธ 
<input type="file" accept="image/*" onchange="handleImageUpload(event);">

// input ์ปดํฌ๋„ŒํŠธ์˜ onChange์— ๋“ฑ๋ก๋œ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ โญ
async function handleImageUpload(event) {

  const imageFile = event.target.files[0]; 
  console.log('originalFile instanceof Blob', imageFile instanceof Blob); // true // blob ํŒŒ์ผ์ธ์ง€ ํ™•์ธ 
  console.log(`originalFile size ${imageFile.size / 1024 / 1024} MB`); // ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋กœ๊ทธ์— ์ถœ๋ ฅ 

// ์˜ต์…˜ ์„ค์ • 
  const options = {
    maxSizeMB: 1, // ์••์ถ• ํ›„์˜ ์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ 
    maxWidthOrHeight: 1920, // ์ด๋ฏธ์ง€์˜ ์ตœ๋Œ€ ๋„ˆ๋น„ ๋˜๋Š” ๋†’์ด
    useWebWorker: true, // ์›น ์›Œ์ปค๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฏธ์ง€ ์••์ถ•์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ (true์ผ ๊ฒฝ์šฐ)
  }
  try {
    const compressedFile = await imageCompression(imageFile, options); 
    // imageCompression์„ ํ˜ธ์ถœํ•ด ์ด๋ฏธ ์••์ถ•, ์••์ถ•๋œ ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ฐ˜ํ™˜ -> compressedFile์— ๋„ฃ์–ด์คŒ 
    console.log('compressedFile instanceof Blob', compressedFile instanceof Blob); // true
    console.log(`compressedFile size ${compressedFile.size / 1024 / 1024} MB`); // smaller than maxSizeMB

    await uploadToServer(compressedFile); // uploadToServer๋Š” ๊ฐ ์‚ฌ์šฉ์ž๋“ค์ด ์—…๋กœ๋“œ ํ•˜๋Š” ํ•จ์ˆ˜ ๋กœ์ง์ด๋‹ค. 
  } catch (error) {
    console.log(error);
  }

}

๐Ÿ˜Ž ์ด์ œ, ๋‚ด ์ฝ”๋“œ์— ์ ์šฉํ•ด๋ณด์ž !

const onChangeImage = async e => {
		const files = e.target.files;

		const updatedImages = [...imageArr];
		const updatedDBImages = [...imageDBArr];

		const options = {
			maxSizeMB: 1,
			maxWidthOrHeight: 1920,
			useWebWorker: true,
		};

		for (let i = 0; i < files.length; i++) {
			const file = files[i];
			try {
				const compressedFile = await imageCompression(file, options);
                // ๊ณต์‹ ๋ฌธ์„œ๋กœ ์น˜๋ฉด, uploadToServer์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š” 
				await updatedImages.push(URL.createObjectURL(compressedFile)); // ๋ฏธ๋ฆฌ๋ณด๊ธฐ
				await updatedDBImages.push(compressedFile); // DB์šฉ
				console.log(compressedFile);
			} catch (error) {
				console.log(error);
			}
		}

		setImageArr(updatedImages.slice(0, 5));
		setImageDBArr(updatedDBImages.slice(0, 5));
	};

์‹ค์ œ๋กœ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ค„์–ด๋“ค๊ฒŒ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์šฉ๋Ÿ‰์„ ์ œํ•œํ•˜๊ณ  ์žˆ๋Š” ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ข‹์€ ํšจ๊ณผ๋ฅผ ๋ณผ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.โœจ

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค :)

0๊ฐœ์˜ ๋Œ“๊ธ€