열린 URL 처리

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

사용자가 파일을 선택하고 '연결 프로그램' 컨텍스트 메뉴 항목을 클릭하면 Drive는 Drive 통합 구성 시 정의된 앱의 Open URL로 사용자를 리디렉션합니다.

Drive 통합을 구성할 때 '가져오기' 체크박스를 선택하면 사용자가 열 수 있는 앱별 파일과Google Workspace 파일의 조합을 선택할 수 있습니다. 앱별 파일은 Drive 통합을 구성할 때 기본 MIME 유형 및 기본 파일 확장 프로그램 필드에 정의됩니다. Google Workspace파일은 Drive 통합을 구성할 때 보조 MIME 유형 및 보조 파일 확장자 필드에 정의됩니다.

사용자가 열려는 각 파일에 대해 Drive에서는 MIME 유형을 개발자가 정의한 기본 MIME 유형과 비교하여 확인합니다.

  • 기본 MIME 유형 필드에 정의된 MIME 유형의 경우 fileID가 앱에 전달됩니다. 앱별 파일을 처리하는 방법에 관한 자세한 내용은 앱별 문서의 열기 URL 처리를 참고하세요.

  • 보조 MIME 유형 필드에 정의된 MIME 유형의 경우 Drive UI에Google Workspace 파일을 변환할 파일 형식을 묻는 대화상자가 표시됩니다. 예를 들어 드라이브 UI에서 Google 문서를 선택하고 보조 MIME 유형 앱에서 앱이 텍스트/html, 텍스트/일반 또는 애플리케이션/pdf를 지원한다고 제안하는 경우 드라이브 UI에서 사용자에게 HTML, 일반 텍스트 또는 PDF로 변환할지 묻습니다. Google Workspace파일을 처리하는 방법에 관한 자세한 내용은 Google Workspace 문서의 열린 URL 처리를 참고하세요. Google Workspace 문서, 변환 형식, 상응하는 MIME 유형 목록은 Google Workspace 문서 및 상응하는 내보내기 MIME 유형을 참고하세요.

앱별 문서의 열린 URL 처리

드라이브 UI 통합 구성에서 언급했듯이 앱은 파일을 열 수 있는 정보가 포함된 템플릿 변수를 수신합니다. 앱이 state 매개변수 내에서 기본 템플릿 변수 집합을 수신합니다. 앱별 URL의 기본 state 정보는 다음과 같습니다.

{
  "ids": ["0Bz0bd"],
  "resourceKeys":{"0Bz0bd":"AAshj23Ad1"},
  "action":"open",
  "userId":"103354693083460731603"
}

이 정보를 처리하려면 다음 안내를 따르세요.

  1. state 매개변수에서 open 값을 감지하여 파일 열기 요청인지 확인합니다.

  2. files.get 메서드를 사용하여 권한을 확인하고, 파일 메타데이터를 가져오고, 파일 콘텐츠를 다운로드합니다.

state 매개변수는 URL로 인코딩되므로 앱에서 이스케이프 문자를 처리하고 JSON으로 파싱해야 합니다.

문서의 Google Workspace 열린 URL 처리

드라이브 UI 통합 구성에서 언급했듯이 앱은 state 매개변수 내에서 기본 템플릿 변수 집합을 수신합니다. 앱별 URL의 기본 state 정보는 다음과 같습니다.

{
  "exportIds": ["0Bz0bd"],
  "resourceKeys":{"0Bz0bd":"AAshj23Ad1"},
  "action":"open",
  "userId":"103354693083460731603"
}

이 정보를 처리하려면 다음 안내를 따르세요.

  1. state 매개변수에서 open 값을 감지하여 파일 열기 요청인지 확인합니다.

  2. 권한을 확인하고 파일 메타데이터를 가져오고 MIME 유형을 확인하세요.

  3. files.export 메서드를 사용하여 파일 콘텐츠를 변환합니다. 다음 스니펫은 파일을 새 파일 형식으로 변환하는 방법을 보여줍니다.

    자바

    drive/snippets/drive_v3/src/main/java/ExportPdf.java
    import com.google.api.client.googleapis.json.GoogleJsonResponseException;
    import com.google.api.client.http.HttpRequestInitializer;
    import com.google.api.client.http.javanet.NetHttpTransport;
    import com.google.api.client.json.gson.GsonFactory;
    import com.google.api.services.drive.Drive;
    import com.google.api.services.drive.DriveScopes;
    import com.google.auth.http.HttpCredentialsAdapter;
    import com.google.auth.oauth2.GoogleCredentials;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Arrays;
    
    /* Class to demonstrate use-case of drive's export pdf. */
    public class ExportPdf {
    
      /**
       * Download a Document file in PDF format.
       *
       * @param realFileId file ID of any workspace document format file.
       * @return byte array stream if successful, {@code null} otherwise.
       * @throws IOException if service account credentials file not found.
       */
      public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException {
        // Load pre-authorized user credentials from the environment.
        // TODO(developer) - See https://developers.google.com/identity for
        // guides on implementing OAuth2 for your application.
        GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
            .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
            credentials);
    
        // Build a new authorized API client service.
        Drive service = new Drive.Builder(new NetHttpTransport(),
            GsonFactory.getDefaultInstance(),
            requestInitializer)
            .setApplicationName("Drive samples")
            .build();
    
        OutputStream outputStream = new ByteArrayOutputStream();
        try {
          service.files().export(realFileId, "application/pdf")
              .executeMediaAndDownloadTo(outputStream);
    
          return (ByteArrayOutputStream) outputStream;
        } catch (GoogleJsonResponseException e) {
          // TODO(developer) - handle error appropriately
          System.err.println("Unable to export file: " + e.getDetails());
          throw e;
        }
      }
    }

    Python

    드라이브/스니펫/drive-v3/file_snippet/export_pdf.py
    from __future__ import print_function
    
    import io
    
    import google.auth
    from googleapiclient.discovery import build
    from googleapiclient.errors import HttpError
    from googleapiclient.http import MediaIoBaseDownload
    
    
    def export_pdf(real_file_id):
        """Download a Document file in PDF format.
        Args:
            real_file_id : file ID of any workspace document format file
        Returns : IO object with location
    
        Load pre-authorized user credentials from the environment.
        TODO(developer) - See https://developers.google.com/identity
        for guides on implementing OAuth2 for the application.
        """
        creds, _ = google.auth.default()
    
        try:
            # create drive api client
            service = build('drive', 'v3', credentials=creds)
    
            file_id = real_file_id
    
            # pylint: disable=maybe-no-member
            request = service.files().export_media(fileId=file_id,
                                                   mimeType='application/pdf')
            file = io.BytesIO()
            downloader = MediaIoBaseDownload(file, request)
            done = False
            while done is False:
                status, done = downloader.next_chunk()
                print(F'Download {int(status.progress() * 100)}.')
    
        except HttpError as error:
            print(F'An error occurred: {error}')
            file = None
    
        return file.getvalue()
    
    
    if __name__ == '__main__':
        export_pdf(real_file_id='1zbp8wAyuImX91Jt9mI-CAX_1TqkBLDEDcr2WeXBbKUY')

    Node.js

    drive/snippets/drive_v3/file_snippets/export_pdf.js
    /**
     * Download a Document file in PDF format
     * @param{string} fileId file ID
     * @return{obj} file status
     * */
    async function exportPdf(fileId) {
      const {GoogleAuth} = require('google-auth-library');
      const {google} = require('googleapis');
    
      // Get credentials and build service
      // TODO (developer) - Use appropriate auth mechanism for your app
      const auth = new GoogleAuth({
        scopes: 'https://www.googleapis.com/auth/drive',
      });
      const service = google.drive({version: 'v3', auth});
    
      try {
        const result = await service.files.export({
          fileId: fileId,
          mimeType: 'application/pdf',
        });
        console.log(result.status);
        return result;
      } catch (err) {
        // TODO(developer) - Handle error
        throw err;
      }
    }

    PHP

    drive/snippets/drive_v3/src/DriveExportPdf.php
    use Google\Client;
    use Google\Service\Drive;
    function exportPdf()
    {
        try {
            $client = new Client();
            $client->useApplicationDefaultCredentials();
            $client->addScope(Drive::DRIVE);
            $driveService = new Drive($client);
            $realFileId = readline("Enter File Id: ");
            $fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
            $fileId = $realFileId;
            $response = $driveService->files->export($fileId, 'application/pdf', array(
                'alt' => 'media'));
            $content = $response->getBody()->getContents();
            return $content;
    
        }  catch(Exception $e) {
             echo "Error Message: ".$e;
        }
    
    }
  4. 변환된 파일을 읽기 전용으로 표시하거나 사용자가 파일을 새 유형의 파일로 저장할 수 있는 대화상자를 표시합니다.

state 매개변수는 URL로 인코딩되므로 앱에서 이스케이프 문자를 처리하고 JSON으로 파싱해야 합니다.

'연결 앱' 이벤트 처리

Drive 앱은 모든 '연결 프로그램' 이벤트를 잠재적인 로그인으로 취급해야 합니다. 일부 사용자는 계정이 여러 개일 수 있으므로 state 매개변수의 사용자 ID가 현재 세션과 일치하지 않을 수 있습니다. state 매개변수의 사용자 ID가 현재 세션과 일치하지 않으면 앱의 현재 세션을 종료하고 요청된 사용자로 로그인합니다.

다음 단계

Google Drive UI에서 애플리케이션을 실행하는 것 외에도 애플리케이션은 파일 선택 도구를 표시하여 앱 자체 내에서 콘텐츠를 선택할 수 있습니다. 자세한 내용은 파일 선택 도구 가이드를 참고하세요.

앱은 변환된 파일을 읽기 전용으로 표시하거나 사용자가 새 파일로 저장할 수 있도록 허용해야 합니다.