티스토리 뷰

반응형

이미 php vender를 설치하기 위해서 아래의 하위 폴더에 vendor폴더 밑에 구글API 관련 프로그램을 설치해서

웹서버에 전송하려고 합니다.

C:\xampp\htdocs\myproject>   -> 여기 밑에 설치

Google Cloud Console에서 프로젝트를 생성하고 Google Drive API를 활성화하여 OAuth 2.0 클라이언트 ID와 비밀 키를 발급받습니다.
Google API PHP Client 설치:

composer require google/apiclient:^2.0
OAuth 2.0 인증 및 파일 업로드: PHP 코드의 주요 수정 포인트는 파일을 구글 드라이브에 업로드하는 부분입니다. 이를 위해 OAuth 인증 과정을 추가하고 Google_Service_Drive 객체를 통해 파일을 업로드하는 로직을 작성해야 합니다.

기존 코드 수정 예제
아래는 기존 파일 업로드 로직을 구글 드라이브 API를 사용하도록 수정한 샘플 코드입니다.

 




<?php
require_once 'vendor/autoload.php';

session_start();

// 구글 OAuth2 인증 설정
$client = new Google_Client();
$client->setClientId('YOUR_CLIENT_ID');
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('YOUR_REDIRECT_URI');
$client->addScope(Google_Service_Drive::DRIVE_FILE);

if (!isset($_SESSION['access_token']) && !isset($_GET['code'])) {
    $authUrl = $client->createAuthUrl();
    echo "<a href='$authUrl'>구글 드라이브 인증</a>";
    exit;
} elseif (isset($_GET['code'])) {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    header('Location: ' . filter_var($client->getRedirectUri(), FILTER_SANITIZE_URL));
} else {
    $client->setAccessToken($_SESSION['access_token']);
}

// Google Drive 서비스 초기화
$service = new Google_Service_Drive($client);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 업로드할 파일 가져오기
    $filename = $_FILES['upfile']['name'][0]; // 첫 번째 파일
    $file_tmp = $_FILES['upfile']['tmp_name'][0];

    // 파일 메타데이터 설정
    $fileMetadata = new Google_Service_Drive_DriveFile(array(
        'name' => $filename,
        'parents' => array('YOUR_FOLDER_ID') // 폴더에 업로드하려면 폴더 ID 추가
    ));

    // 파일 업로드 실행
    $content = file_get_contents($file_tmp);
    $uploadedFile = $service->files->create($fileMetadata, array(
        'data' => $content,
        'mimeType' => mime_content_type($file_tmp),
        'uploadType' => 'multipart',
        'fields' => 'id'
    ));

    // 파일 업로드 성공 메시지
    if ($uploadedFile) {
        echo "파일이 구글 드라이브에 업로드되었습니다. 파일 ID: " . $uploadedFile->id;
    } else {
        echo "파일 업로드 실패";
    }
}
?>
코드 변경 포인트
OAuth 2.0 인증 처리: 최초 접근 시 인증 URL로 리디렉션 후 구글 드라이브 접근 권한을 부여받습니다.
파일 업로드: 기존 서버 파일 경로를 구글 드라이브에 맞게 수정하여 Google_Service_Drive 객체를 사용해 업로드합니다.
YOUR_FOLDER_ID: 구글 드라이브 내 특정 폴더에 업로드하려면 해당 폴더의 ID를 넣어야 합니다.
주요 수정 사항 요약
기존 카페24 서버의 파일 업로드 경로를 구글 드라이브 API 요청으로 교체.
fileuploads 디렉토리 대신 Google Drive API를 사용하여 파일을 저장하며, 파일 ID를 구글 드라이브 링크로 활용할 수 있습니다.
업로드된 파일의 ID를 데이터베이스에 저장하여 파일 접근 경로를 관리합니다.
이렇게 하면 카페24 서버 대신 구글 드라이브에 파일을 업로드하여 사용할 수 있습니다.

내PC 설치하는 과정에서 나오는 메시지들

C:\xampp\htdocs\myproject>composer require google/apiclient:^2.0 -W
The "2.0" constraint for "google/apiclient" appears too strict and will likely not match what you want. See https://getcomposer.org/constraints
./composer.json has been updated
Running composer update google/apiclient --with-all-dependencies
Loading composer repositories with package information
Updating dependencies
Lock file operations: 11 installs, 1 update, 0 removals
  - Locking firebase/php-jwt (v3.0.0)
  - Locking google/apiclient (v2.0.0)
  - Locking google/apiclient-services (v0.381.0)
  - Locking google/auth (v0.8)
  - Locking guzzlehttp/guzzle (6.2.0)
  - Locking guzzlehttp/promises (1.5.3)
  - Locking guzzlehttp/psr7 (1.2.3)
  - Locking monolog/monolog (1.27.1)
  - Locking phpseclib/phpseclib (2.0.47)
  - Locking psr/cache (1.0.1)
  - Downgrading psr/http-message (2.0 => 1.1)
  - Locking psr/log (1.1.4)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 11 installs, 1 update, 0 removals
  - Installing phpseclib/phpseclib (2.0.47): Extracting archive
  - Installing psr/log (1.1.4): Extracting archive
  - Installing monolog/monolog (1.27.1): Extracting archive
  - Downgrading psr/http-message (2.0 => 1.1): Extracting archive
  - Installing guzzlehttp/psr7 (1.2.3): Extracting archive
  - Installing guzzlehttp/promises (1.5.3): Extracting archive
  - Installing guzzlehttp/guzzle (6.2.0): Extracting archive
  - Installing psr/cache (1.0.1): Extracting archive
  - Installing firebase/php-jwt (v3.0.0): Extracting archive
  - Installing google/auth (v0.8): Extracting archive
  - Installing google/apiclient-services (v0.381.0): Extracting archive
  - Installing google/apiclient (v2.0.0): Extracting archive
15 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
5 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Found 14 security vulnerability advisories affecting 4 packages.
Run "composer audit" for a full list of advisories.






나의 말:
composer require google/apiclient:^2.0

위의 명령으로 만약 c:/xampp  에서 실행하면 어떤 폴더에 내용이 설치되는가?
ChatGPT의 말:
ChatGPT
c:/xampp에서 composer require google/apiclient:^2.0 명령을 실행하면 현재 위치한 폴더에 vendor 폴더가 생성되고, 그 안에 필요한 라이브러리들이 설치됩니다.

예를 들어, c:/xampp/htdocs/your_project 폴더에서 명령어를 실행하면:

c:/xampp/htdocs/your_project/vendor 폴더가 생성되고, 그 안에 구글 API 클라이언트 라이브러리가 설치됩니다.
이 폴더에는 autoload.php 파일도 포함되어, 프로젝트에서 require_once 'vendor/autoload.php';를 통해 구글 API와 관련된 클래스를 쉽게 로드할 수 있습니다.
따라서 composer 명령을 실행할 때는 PHP 프로젝트가 있는 폴더에서 실행하여, 해당 프로젝트 내에 vendor 폴더와 autoload.php가 생성되도록 합니다.



나의 말:
위의 생성하면 어떤 폴더가 생기나? 구글 API 설치하면 말이다.
ChatGPT의 말:
composer require google/apiclient:^2.0 명령어로 구글 API PHP 클라이언트를 설치하면 vendor 폴더 내에 다음과 같은 폴더와 파일이 생성됩니다.

생성되는 주요 폴더 구조
vendor/
autoload.php: 프로젝트에서 require_once 'vendor/autoload.php';로 모든 종속성을 자동으로 로드할 수 있게 해주는 파일입니다.
composer/: Composer 관련 메타데이터와 설정 파일들이 저장된 폴더입니다.
google/: 구글 관련 API 라이브러리가 들어 있는 폴더입니다.
apiclient/: 구글 API 클라이언트 라이브러리의 실제 코드가 들어 있습니다.
apiclient-services/: Google API와 연동하는 여러 서비스 클래스가 포함된 폴더입니다.
guzzlehttp/: 구글 API PHP 클라이언트가 내부적으로 HTTP 요청을 처리하기 위해 사용하는 Guzzle 라이브러리가 들어 있습니다.
psr/: PSR-7 등의 PHP 표준 인터페이스가 포함된 폴더입니다.
주요 파일 및 폴더
vendor/google/apiclient 폴더: 구글 API 클라이언트 라이브러리의 핵심 코드.
vendor/google/apiclient-services 폴더: Google Drive, Google Sheets와 같은 다양한 구글 서비스와의 통합에 필요한 서비스 클래스.
vendor/guzzlehttp: HTTP 요청을 처리하기 위해 Guzzle을 사용하는 구글 클라이언트의 의존성.
이 폴더 구조가 자동으로 생성되며, 이를 통해 구글 드라이브와 같은 API를 PHP로 쉽게 사용할 수 있습니다.


나의 말:
C:\xampp\htdocs\myproject>composer require google/apiclient:^2.0
The "2.0" constraint for "google/apiclient" appears too strict and will likely not match what you want. See https://getcomposer.org/constraints
./composer.json has been updated
Running composer update google/apiclient
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - google/auth v0.8 requires psr/http-message ^1.0 -> found psr/http-message[1.0, 1.0.1, 1.1] but the package is fixed to 2.0 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
    - google/apiclient v2.0.0 requires google/auth 0.8 -> satisfiable by google/auth[v0.8].
    - Root composer.json requires google/apiclient 2.0 -> satisfiable by google/apiclient[v2.0.0].

Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.

Installation failed, reverting ./composer.json and ./composer.lock to their original content.

C:\xampp\htdocs\myproject>
ChatGPT의 말:
ChatGPT
이 오류는 google/apiclient 패키지를 설치하는 과정에서 의존성 충돌이 발생했기 때문입니다. google/auth 패키지가 psr/http-message 패키지의 특정 버전(1.x)을 필요로 하지만, 현재 사용 중인 버전은 2.x 버전으로 고정되어 있어서 충돌이 발생합니다.

이 문제를 해결하기 위해 다음과 같은 방법을 시도할 수 있습니다.

해결 방법 1: --with-all-dependencies 옵션 사용
의존성 충돌을 해결하기 위해 Composer 명령어에 -W 옵션을 추가하여 의존성 패키지의 업데이트를 허용합니다.

composer require google/apiclient:^2.0 -W
이 명령어는 psr/http-message 패키지를 포함하여 필요한 패키지를 모두 업데이트하여 의존성 문제를 해결합니다.

이렇게 해결했어요. 위의 명령어로

해결 방법 2: 최신 버전으로 설치하기
또한 google/apiclient의 최신 버전을 사용하도록 버전을 수정하면 의존성 충돌을 피할 수 있습니다. composer.json에서 google/apiclient:^2.0 대신 최신 버전을 사용하도록 수정한 후 다시 시도해 보세요.

composer require google/apiclient
이 두 가지 방법 중 하나를 사용하여 설치하면 의존성 문제를 해결하고 google/apiclient 패키지를 성공적으로 설치할 수 있을 것입니다.

 

(php 버전으로 인한 문제) 이 부분 체크가 필요합니다.

내가 사용하는 php는 7.3버전인데, 위의 코드를 실행하면 아래와 같이 오류가 난다.
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0". You are running 7.3.1p1. in /mirae8440/www/vendor/composer/platform_check.php on line 28

해결방법은?
ChatGPT의 말:
ChatGPT
이 오류는 현재 사용 중인 PHP 7.3 버전이 Google API PHP 클라이언트 라이브러리의 요구 사항인 PHP 8.1 이상 버전을 충족하지 않아서 발생한 문제입니다.

해결 방법은 다음과 같습니다.

방법 1: 호환되는 버전의 google/apiclient 설치
현재 PHP 7.3과 호환되는 Google API PHP 클라이언트 라이브러리의 이전 버전을 설치할 수 있습니다. Google API PHP 클라이언트 라이브러리의 2.10.1 버전은 PHP 7.2+에서 호환됩니다.

composer require google/apiclient:^2.10.1
이 명령을 사용하면 PHP 7.3 환경에서 사용할 수 있는 호환 가능한 Google API 클라이언트 버전이 설치됩니다.

방법 2: PHP 버전 업그레이드
만약 PHP를 8.1 이상으로 업그레이드할 수 있다면, Composer에서 최신 버전의 google/apiclient를 그대로 사용할 수 있습니다. PHP 8.1로 업그레이드하면 최신 보안 패치와 성능 향상도 함께 제공됩니다.

PHP 8.1 설치: 사용 중인 서버 환경에 맞게 PHP 8.1을 설치합니다.
PHP 버전 변경 확인: 설치가 완료되면 PHP 8.1이 제대로 설정되었는지 확인합니다.
Composer 명령 실행: 이제 Composer에서 최신 google/apiclient 패키지를 설치할 수 있습니다.
권장 해결 방법: PHP 업그레이드가 어려운 상황이라면, 방법 1을 사용하여 PHP 7.3에 호환되는 Google API 클라이언트의 이전 버전을 설치하는 것이 좋습니다.

다시 정리하면,

$client->setRedirectUri('https://8440.co.kr/drive/upload.php'); // 리디렉션 URI
이 코드에 맞게 OAuth2.0에 URI 추가를 해줘야 하나?
ChatGPT의 말:
ChatGPT
네, Google OAuth 2.0 인증 과정에서 setRedirectUri에 설정된 URI는 Google Cloud Console의 OAuth 2.0 클라이언트 설정에서 미리 등록되어 있어야 합니다. 매번 새로운 파일로 인증 처리를 할 경우 그 파일의 경로를 Google Cloud Console의 리디렉션 URI에 추가해 주어야 인증이 정상적으로 이루어집니다.

해결 방법
Google Cloud Console에 여러 리디렉션 URI 추가하기:

Google Cloud Console의 OAuth 클라이언트 설정에서 여러 URI를 추가할 수 있습니다.
매번 다른 경로로 인증을 테스트하거나 사용할 예정이라면, 예상되는 모든 경로를 리디렉션 URI 리스트에 미리 추가해 주세요.
예를 들어, /drive/upload.php, /drive/view.php, /drive/another.php 등이 있다면 각각을 개별 리디렉션 URI로 추가할 수 있습니다.
고정된 리디렉션 URI 사용하기:

매번 다른 파일로 인증 처리를 진행할 필요가 없다면, 하나의 고정된 파일을 리디렉션 URI로 지정하는 것도 방법입니다.
예를 들어, 모든 인증 요청을 /drive/auth.php와 같은 하나의 고정된 파일로 처리한 뒤, 인증이 완료되면 필요에 따라 다른 페이지로 리다이렉트하도록 설정할 수 있습니다.
예시: 고정된 리디렉션 URI 사용
고정 리디렉션 URI 파일 생성:

예를 들어 /drive/auth.php라는 파일을 사용하여 인증을 처리합니다.
인증 후 리다이렉트 추가:

인증이 완료된 후, 원하는 파일로 다시 이동하도록 코드에 리다이렉트를 추가합니다.

예를들어)

'미래기업' 폴더 내 'imgwork' 폴더 생성:

'미래기업' 폴더가 존재하는지 확인하고, 없으면 생성합니다.
'미래기업' 폴더 안에 'imgwork' 폴더가 존재하는지 확인하고, 없으면 생성합니다.
파일 업로드 경로 변경:

/imgwork 폴더의 파일을 Google Drive의 '미래기업/imgwork' 폴더에 업로드합니다.
업로드된 파일은 모든 사용자가 접근할 수 있도록 링크를 생성합니다.
'미래기업/imgwork' 폴더 내 파일 목록 출력:

미래기업/imgwork 폴더 내에 업로드된 파일 목록을 표시하여 웹 페이지에서 링크로 파일을 참조할 수 있도록 했습니다.
이렇게 하면, /imgwork 폴더의 모든 파일이 Google Drive의 '미래기업/imgwork' 폴더에 업로드되며, 파일에 대한 액세스 링크도 생성됩니다.

반응형
댓글