PHP 예제

주의

서버 보안을 위해 파일 업로드 및 문서 임포트 처리를 구현할 때 아래 가이드를 참고합니다.

소프트웨어 보안 취약점 진단 가이드

1. 사전 준비 사항

2. 이미지 업로드 (Video 및 파일 업로드도 동일한 패턴을 따릅니다)

주의

아래 샘플 코드의 파일 업로드 부분은 의도적으로 최소화되어 있으며, 적절한 보안 처리가 적용되어 있지 않습니다.

파일 업로드는 프로젝트에 이미 구현된 기능을 사용하고, 아래 코드는 에디터 연동 부분만 참고합니다.

<?php
try {
    $uploadDir   = 'uploads/images';
    $fieldName   = 'file';

    $fileNameParts = explode('.', $_FILES[$fieldName]['name']);
    $extension     = end($fileNameParts);
    $tmpName       = $_FILES[$fieldName]['tmp_name'];
    $newFileName   = sha1(microtime());
    $fileUploadPath = "${uploadDir}/${newFileName}.${extension}";

    move_uploaded_file($tmpName, $fileUploadPath);

    header('Content-Type: application/json');
    echo json_encode(['uploadPath' => $fileUploadPath]);
} catch (Exception $e) {
    echo $e->getMessage();
    http_response_code(404);
}

3. HWP / Word / 엑셀 문서 임포트

주의

아래 샘플 코드의 파일 업로드 부분은 의도적으로 최소화되어 있으며, 적절한 보안 처리가 적용되어 있지 않습니다.

파일 업로드는 프로젝트에 이미 구현된 기능을 사용하고, 아래 코드는 에디터 연동 부분만 참고합니다.

<?php
try {
    $uploadDir = 'uploads/docs';
    $fieldName = 'file';

    $fileNameParts  = explode('.', $_FILES[$fieldName]['name']);
    $extension      = end($fileNameParts);
    $tmpName        = $_FILES[$fieldName]['tmp_name'];
    $newFileName    = sha1(microtime());
    $fileUploadPath = "${uploadDir}/${newFileName}.${extension}";
    move_uploaded_file($tmpName, $fileUploadPath);

    // Conversion output directory
    $wordDir    = 'works';
    $importPath = "${wordDir}/${newFileName}";
    executeConverter($fileUploadPath, $importPath);

    // Serialize document.pb
    // From v2.3.0 the filename is "document.pb" (was "document.word.pb")
    $pbFilePath     = "${importPath}/document.pb";
    $serializedData = readPBData($pbFilePath);

    header('Content-Type: application/json');
    echo json_encode([
        'serializedData' => $serializedData,
        'importPath'     => $importPath,
    ]);
} catch (Exception $e) {
    echo $e->getMessage();
    http_response_code(404);
}

function executeConverter($inputFilePath, $outputFilePath)
{
    $sedocConverterPath = 'c:/sedocConverter/sedocConverter.exe';
    $fontsDir           = 'c:/sedocConverter/fonts';
    $tempDir            = 'c:/sedocConverter/tmp';
    $cmd = "${sedocConverterPath} -f ${fontsDir} ${inputFilePath} ${outputFilePath} ${tempDir}";
    exec($cmd);
}

function readPBData($pbFilePath)
{
    $fb   = fopen($pbFilePath, 'r');
    $data = stream_get_contents($fb, -1, 16);
    fclose($fb);

    $byteArray = unpack('C*', zlib_decode($data));
    // PHP < 5.4.0: use gzuncompress instead
    // $byteArray = unpack('C*', gzuncompress($data));
    return array_values($byteArray);
}

관련 정보