Files
sam-kd/filedrive/GD_page.php
hskwon aca1767eb9 초기 커밋: 5130 레거시 시스템
- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경
- DB 연결 하드코딩 → .env 기반으로 변경
- MySQL strict mode DATE 오류 수정
2025-12-10 20:14:31 +09:00

256 lines
10 KiB
PHP

<?php
// 인정검사 페이지까지 저장하는 부분 page 컬럼 추가
// 기본 tablename, item, page 이렇게 저장함
require_once $_SERVER['DOCUMENT_ROOT'] . '/session.php'; // 세션 파일 포함
require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/common.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/lib/mydb.php';
// Google Drive 서비스 계정 인증 설정
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $_SERVER['DOCUMENT_ROOT'] . '/tokens/mytoken.json');
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->setScopes([Google_Service_Drive::DRIVE]);
$service = new Google_Service_Drive($client);
header("Content-Type: application/json"); // JSON 응답 설정
// 특정 경로의 폴더 확인 또는 생성 (재귀적 처리)
function getOrCreateFolderByPath($service, $path) {
$pathParts = explode('/', $path);
$parentId = null; // 최상위 루트
foreach ($pathParts as $part) {
if (empty($part)) continue;
$query = "name='$part' and mimeType='application/vnd.google-apps.folder' and trashed=false";
if ($parentId) {
$query .= " and '$parentId' in parents";
}
$response = $service->files->listFiles([
'q' => $query,
'spaces' => 'drive',
'fields' => 'files(id, name)'
]);
if (count($response->files) > 0) {
$parentId = $response->files[0]->id;
} else {
$fileMetadata = new Google_Service_Drive_DriveFile([
'name' => $part,
'mimeType' => 'application/vnd.google-apps.folder',
'parents' => $parentId ? [$parentId] : []
]);
$folder = $service->files->create($fileMetadata, ['fields' => 'id']);
$parentId = $folder->id;
}
}
return $parentId;
}
// 파일 공개 설정 함수
function setFilePublic($service, $fileId) {
$permission = new Google_Service_Drive_Permission();
$permission->setRole('reader');
$permission->setType('anyone');
try {
$service->permissions->create($fileId, $permission);
return true;
} catch (Exception $e) {
error_log("권한 설정 실패: " . $e->getMessage());
return false;
}
}
// HTTP 메서드에 따른 처리
$method = $_SERVER['REQUEST_METHOD'];
$folderPath = $_REQUEST['folderPath'] ?? '경동기업/uploads'; // 기본 폴더 경로
$DBtable = $_REQUEST['DBtable'] ?? 'picuploads' ;
$uploadsFolderId = getOrCreateFolderByPath($service, $folderPath);
$upfilename = $_REQUEST['upfilename'] ?? 'upfile';
// num이 없으면 timekey를 받아온다.
$parentnum = !empty($_REQUEST["num"]) ? $_REQUEST["num"] : $_REQUEST["timekey"];
$page = !empty($_REQUEST["page"]) ? $_REQUEST["page"] : 0 ;
// 세션에서 DB 이름 가져오기
$DB = $_SESSION['DB'] ?? 'chandj';
if ($method === 'POST') {
$tablename = $_REQUEST['tablename'] ?? '';
$item = $_REQUEST['item'] ?? '';
// 파일 업로드 데이터 검증
if (!isset($_FILES[$upfilename]) || !isset($_FILES[$upfilename]['name']) || !is_array($_FILES[$upfilename]['name'])) {
echo json_encode(['error' => '파일 데이터가 유효하지 않습니다.'], JSON_UNESCAPED_UNICODE);
exit;
}
$countfiles = count($_FILES[$upfilename]['name']);
$response = [];
for ($i = 0; $i < $countfiles; $i++) {
$filename = $_FILES[$upfilename]['name'][$i];
if ($filename) {
$tmpNm = explode('.', $filename);
$ext = strtolower(end($tmpNm));
$isImage = in_array($ext, ['jpg', 'jpeg', 'png', 'gif']);
$microtime = microtime(true);
$milliseconds = sprintf("%03d", ($microtime - floor($microtime)) * 1000);
$new_file_name = date("Y_m_d_H_i_s", $microtime) . "_" . $milliseconds . "_" . $i . "." . $ext;
$filePath = $_FILES[$upfilename]['tmp_name'][$i]; // 원본 파일 경로
if ($isImage) {
// 이미지인 경우 압축 처리
$tempDir = $_SERVER['DOCUMENT_ROOT'] . '/temp/';
if (!file_exists($tempDir)) {
mkdir($tempDir, 0755, true);
}
$compressedFilePath = $tempDir . $new_file_name;
$filePath = compress_image($filePath, $compressedFilePath, 70);
if (!$filePath) {
$response[] = ['file' => $filename, 'status' => 'error', 'message' => '이미지 압축 실패.'];
continue;
}
}
try {
// Google Drive에 파일 업로드
$fileMetadata = new Google_Service_Drive_DriveFile([
'name' => $new_file_name,
'parents' => [$uploadsFolderId]
]);
$content = file_get_contents($filePath);
$uploadedFile = $service->files->create($fileMetadata, [
'data' => $content,
'mimeType' => mime_content_type($filePath),
'uploadType' => 'multipart',
'fields' => 'id, webViewLink'
]);
$fileId = $uploadedFile->id;
setFilePublic($service, $fileId);
// 데이터베이스에 저장
$pdo = db_connect();
$pdo->beginTransaction();
$sql = "INSERT INTO {$DB}.{$DBtable} (tablename, item, parentnum, picname, realname, page) VALUES (?, ?, ?, ?, ?, ?)";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, $tablename, PDO::PARAM_STR);
$stmh->bindValue(2, $item, PDO::PARAM_STR);
$stmh->bindValue(3, $parentnum, PDO::PARAM_STR);
$stmh->bindValue(4, $fileId, PDO::PARAM_STR);
$stmh->bindValue(5, $filename, PDO::PARAM_STR);
$stmh->bindValue(6, $page, PDO::PARAM_INT);
$stmh->execute();
$pdo->commit();
$response[] = ['file' => $filename, 'status' => 'success', 'new_name' => $new_file_name, 'fileId' => $fileId , 'realname' => $filename, 'page' => $page ] ;
} catch (Exception $e) {
error_log("Google Drive 업로드 실패: " . $e->getMessage());
$response[] = ['file' => $filename, 'status' => 'error', 'message' => $e->getMessage()];
}
// 임시 파일 삭제 (이미지일 경우만 삭제)
if ($isImage && isset($compressedFilePath) && file_exists($compressedFilePath)) {
unlink($compressedFilePath);
}
}
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} elseif ($method === 'GET') {
$action = $_REQUEST['action'] ?? ''; // action 파라미터 확인
$tablename = $_REQUEST['tablename'] ?? '';
$item = $_REQUEST['item'] ?? '';
$parentnum = $_REQUEST['num'] ?? '';
$page = $_REQUEST['page'] ?? '';
$lotVolumn = intval($_REQUEST['lotVolumn'] ?? 1); // 전체 페이지
$response = [];
$pdo = db_connect();
if ($action === 'checkMissingPages') {
// 사진 등록 미완료 페이지 확인 로직
try {
$sql = "SELECT DISTINCT page FROM {$DB}.{$DBtable} WHERE tablename = ? AND parentnum = ?";
$stmh = $pdo->prepare($sql);
$stmh->execute([$tablename, $parentnum]);
$registeredPages = $stmh->fetchAll(PDO::FETCH_COLUMN);
$missingPages = [];
for ($i = 1; $i <= $lotVolumn; $i++) {
if (!in_array($i, $registeredPages)) {
$missingPages[] = $i;
}
}
$response = $missingPages; // 등록되지 않은 페이지 반환
} catch (Exception $e) {
error_log("미완료 페이지 확인 실패: " . $e->getMessage());
$response = ['error' => $e->getMessage()];
}
} else {
// 파일 조회 처리
try {
$sql = "SELECT * FROM {$DB}.{$DBtable} WHERE tablename = ? AND item = ? AND parentnum = ? AND page = ?";
$stmh = $pdo->prepare($sql);
$stmh->execute([$tablename, $item, $parentnum, $page]);
while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
$fileId = $row['picname'];
$realname = $row['realname'];
$file = $service->files->get($fileId, ['fields' => 'thumbnailLink, webViewLink']);
$response[] = [
'fileId' => $fileId,
'thumbnail' => $file->thumbnailLink ?? "https://drive.google.com/uc?id=$fileId",
'link' => $file->webViewLink,
'realname' => $realname
];
}
} catch (Exception $e) {
error_log("파일 조회 실패: " . $e->getMessage());
$response = ['error' => $e->getMessage()];
}
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} elseif ($method === 'DELETE') {
// JSON 데이터 파싱
$input = json_decode(file_get_contents('php://input'), true);
$fileId = $input['fileId'] ?? '';
$tablename = $input['tablename'] ?? '';
$item = $input['item'] ?? '';
$folderPath = $input['folderPath'] ?? '';
$DBtable = $input['DBtable'] ?? 'picuploads';
$response = [];
try {
// Google Drive 파일 삭제
$service->files->delete($fileId);
// 데이터베이스에서 파일 정보 삭제
$pdo = db_connect();
$sql = "DELETE FROM {$DB}.{$DBtable} WHERE tablename = ? AND item = ? AND picname = ? ";
$stmh = $pdo->prepare($sql);
$stmh->execute([$tablename, $item, $fileId]);
$response = ['status' => 'success', 'message' => '파일 삭제 완료'];
} catch (Exception $e) {
error_log("파일 삭제 실패: " . $e->getMessage());
$response = ['status' => 'error', 'message' => $e->getMessage()];
}
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} else {
echo json_encode(['error' => '지원하지 않는 요청 방식입니다.'], JSON_UNESCAPED_UNICODE);
}