JavaScript 로 동영상 해상도 확인후 서버로 전송하기

2025. 6. 4. 22:27프로그램/Javascript

서버호스팅은 루젠호스트

 

JavaScript(클라이언트 측)에서 동영상 해상도를 확인하고 PHP(서버 측)로 전송하는 방법을 자세히 알려드리겠습니다. 이 방법은 사용자가 동영상을 업로드하거나 페이지를 로드할 때 클라이언트 브라우저에서 직접 동영상의 메타데이터를 읽어 서버로 보내는 방식입니다.

이 과정은 크게 세 단계로 나뉩니다.

  1. HTML: 동영상을 표시하고 JavaScript 코드를 실행할 페이지.
  2. JavaScript: 동영상 해상도를 가져와 AJAX(Asynchronous JavaScript and XML) 요청으로 PHP에 전송.
  3. PHP: JavaScript로부터 전송된 해상도 데이터를 받아 처리.

1단계: HTML 페이지 준비

동영상을 로드할 <video> 태그와, 해상도를 확인하여 전송할 스크립트가 포함될 HTML 파일을 만듭니다. (예: index.html)

HTML
 
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>동영상 해상도 전송 예제</title>
</head>
<body>

    <h1>동영상 해상도 확인 및 전송</h1>

    <video id="myVideo" controls preload="metadata" style="max-width: 600px; display: block; margin-bottom: 20px;">
        <source src="your_video.mp4" type="video/mp4">
        Your browser does not support the video tag.
    </video>

    <p>
        <button id="sendDimensionsBtn">동영상 해상도 전송하기</button>
    </p>

    <div id="statusMessage" style="margin-top: 20px; color: blue;"></div>

    <script>
        const videoElement = document.getElementById('myVideo');
        const sendButton = document.getElementById('sendDimensionsBtn');
        const statusMessage = document.getElementById('statusMessage');

        let videoWidth = 0;
        let videoHeight = 0;

        // 동영상 메타데이터가 로드되면 해상도 정보 가져오기
        videoElement.addEventListener('loadedmetadata', () => {
            videoWidth = videoElement.videoWidth;
            videoHeight = videoElement.videoElementHeight; // 오타 수정: videoElementHeight -> videoHeight
            statusMessage.textContent = `동영상 해상도 감지됨: ${videoWidth}x${videoHeight}`;
            console.log(`동영상 해상도: ${videoWidth}x${videoHeight}`);
        });

        // 에러 처리: 동영상을 로드할 수 없을 때
        videoElement.addEventListener('error', (e) => {
            statusMessage.textContent = '동영상 로드 중 오류 발생: ' + e.message;
            console.error('동영상 로드 오류:', e);
        });

        // 버튼 클릭 시 PHP로 데이터 전송
        sendButton.addEventListener('click', () => {
            if (videoWidth === 0 || videoHeight === 0) {
                statusMessage.textContent = '동영상 해상도를 먼저 감지해야 합니다.';
                alert('동영상 해상도를 먼저 감지해야 합니다. 동영상이 완전히 로드되었는지 확인하세요.');
                return;
            }

            statusMessage.textContent = '서버로 데이터 전송 중...';

            fetch('save_video_dimensions.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded', // POST 요청의 기본 형식
                },
                // FormData를 사용하면 더 간편하게 보낼 수 있습니다:
                // body: new URLSearchParams({
                //     width: videoWidth,
                //     height: videoHeight,
                //     video_url: videoElement.src // 동영상 URL도 함께 보낼 수 있음
                // }).toString(),
                body: `width=${videoWidth}&height=${videoHeight}&video_url=${encodeURIComponent(videoElement.src)}`
            })
            .then(response => response.text()) // 또는 response.json()
            .then(data => {
                statusMessage.textContent = `서버 응답: ${data}`;
                console.log('서버 응답:', data);
            })
            .catch(error => {
                statusMessage.textContent = '데이터 전송 중 오류 발생: ' + error.message;
                console.error('Fetch 오류:', error);
            });
        });

        // 페이지 로드 시 동영상 메타데이터 미리 로드 시도
        // videoElement.load(); // preload="metadata" 속성으로 대체 가능
    </script>

</body>
</html>

코드 설명 (HTML/JavaScript):

  • <video id="myVideo" controls preload="metadata">: 동영상 요소입니다.
    • controls: 재생/일시정지 등의 컨트롤러를 표시합니다.
    • preload="metadata": 동영상의 메타데이터(길이, 해상도 등)만 미리 로드하도록 브라우저에 지시합니다. 전체 동영상 파일 로드를 기다리지 않아도 해상도를 얻을 수 있어 효율적입니다.
  • videoElement.addEventListener('loadedmetadata', ...): 동영상의 메타데이터가 성공적으로 로드되면 이 이벤트가 발생합니다.
  • videoElement.videoWidth 및 videoElement.videoHeight: 이 속성들은 loadedmetadata 이벤트 이후에 동영상의 실제 가로/세로 픽셀 값을 반환합니다.
  • fetch('save_video_dimensions.php', { ... }): JavaScript의 fetch API를 사용하여 save_video_dimensions.php 파일로 HTTP POST 요청을 보냅니다.
    • method: 'POST': POST 방식으로 데이터를 전송합니다.
    • headers: { 'Content-Type': 'application/x-www-form-urlencoded' }: 서버가 데이터를 어떻게 인코딩했는지 알 수 있도록 헤더를 설정합니다. (일반적인 폼 제출 방식)
    • body:width=${videoWidth}&height=${videoHeight}&video_url=${encodeURIComponent(videoElement.src)}: 전송할 데이터입니다.width,height,video_url을 쿼리 문자열 형식으로 만들어서 보냅니다.encodeURIComponent()`는 URL에 포함될 수 없는 특수 문자를 안전하게 인코딩합니다.
    • .then().catch(): 서버로부터의 응답을 처리하고, 오류가 발생했을 때 처리하는 Promise 구문입니다.

2단계: PHP 스크립트 준비

JavaScript에서 보낸 데이터를 받아 처리할 PHP 파일을 만듭니다. (예: save_video_dimensions.php)

PHP
 
<?php

header('Content-Type: text/plain; charset=utf-8'); // 응답이 일반 텍스트임을 명시

// POST 요청으로 데이터가 전송되었는지 확인
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // POST 데이터에서 너비, 높이, 동영상 URL 가져오기
    $width = $_POST['width'] ?? 'N/A'; // ??는 PHP 7 이상 Null Coalescing Operator
    $height = $_POST['height'] ?? 'N/A';
    $video_url = $_POST['video_url'] ?? 'N/A';

    // 데이터가 유효한지 간단히 검증 (더 강력한 검증 필요)
    if (is_numeric($width) && is_numeric($height) && $width > 0 && $height > 0) {
        // 여기에서 동영상 해상도 데이터를 데이터베이스에 저장하거나, 로그 파일에 기록하는 등의 서버 작업을 수행할 수 있습니다.
        // 예: database_save_function($video_url, $width, $height);
        // 예: file_put_contents('video_dimensions.log', "URL: {$video_url}, Width: {$width}, Height: {$height}\n", FILE_APPEND);

        echo "SUCCESS: 동영상 해상도가 성공적으로 수신되었습니다. Width: {$width}, Height: {$height}, URL: {$video_url}";
    } else {
        echo "ERROR: 유효하지 않은 동영상 해상도 데이터입니다.";
    }

} else {
    // POST 요청이 아닌 경우
    echo "ERROR: 이 스크립트는 POST 요청만 처리합니다.";
}

?>

코드 설명 (PHP):

  • header('Content-Type: text/plain; charset=utf-8');: 클라이언트에 응답하는 데이터의 MIME 타입과 인코딩을 지정합니다.
  • if ($_SERVER['REQUEST_METHOD'] === 'POST'): 요청이 POST 방식으로 왔는지 확인합니다.
  • $_POST['width'], $_POST['height'], $_POST['video_url']: JavaScript에서 fetch 요청의 body에 보낸 데이터는 PHP의 $_POST 슈퍼글로벌 배열을 통해 접근할 수 있습니다.
    • ?? 'N/A': PHP 7부터 도입된 Null Coalescing Operator로, 해당 키가 없으면 'N/A'를 기본값으로 사용합니다.
  • is_numeric(): 수신된 값이 숫자인지 간단히 검증합니다. 실제 서비스에서는 더 강력한 유효성 검사(데이터 범위, SQL 인젝션 방지 등)가 필요합니다.
  • 여기서 DB 저장, 로그 기록 등의 서버 로직을 구현합니다.
  • echo: PHP 스크립트의 echo 출력은 JavaScript fetch의 response.text() (또는 response.json())로 클라이언트에 전달됩니다.

실행 방법:

  1. 위의 HTML 코드를 index.html로 저장합니다.
  2. 위의 PHP 코드를 save_video_dimensions.php로 저장합니다.
  3. index.html 파일에서 <video> 태그의 src="your_video.mp4" 부분을 실제 접근 가능한 MP4 파일 경로로 수정합니다. (예: src="sample.mp4"와 같이 같은 디렉터리에 샘플 MP4 파일을 두거나, 웹 서버의 공개된 경로로 지정)
  4. 이 두 파일을 웹 서버(Apache, Nginx 등)의 문서 루트 디렉터리에 업로드합니다.
  5. 브라우저에서 index.html 파일에 접근합니다 (예: http://localhost/index.html).
  6. 페이지가 로드되고 동영상 메타데이터가 로드되면 "동영상 해상도 감지됨" 메시지가 표시됩니다.
  7. "동영상 해상도 전송하기" 버튼을 클릭하면, JavaScript가 해상도 데이터를 PHP 스크립트로 전송하고, PHP 스크립트의 응답이 화면에 표시됩니다.

중요 보안 고려사항:

  • 사용자로부터 받은 데이터($_POST로 수신된 데이터)는 항상 신뢰할 수 없습니다. 데이터베이스에 저장하거나 다른 용도로 사용하기 전에 **반드시 적절한 유효성 검사(Validation)와 살균(Sanitization)**을 수행해야 합니다 (예: filter_var(), mysqli_real_escape_string() 또는 PDO/Prepared Statements 사용).
  • 이 예시는 HTTP POST 요청을 사용하므로, CORS(Cross-Origin Resource Sharing) 문제가 발생할 가능성이 적습니다. 하지만 만약 JavaScript를 다른 도메인에서 실행하고 PHP 스크립트로 데이터를 보내려 한다면 CORS 설정이 필요할 수 있습니다.
 
적용된 페이지 확인하기 : https://pds.luzensoft.com/detailview.php?fno=53175
 

루젠소프트 자료실

자료실,무료다운로드,프리웨어,셰어웨어,개발도구

pds.luzensoft.com