사용자의 파일 업로드 허용

리전 ID

REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다.

리전 ID에 대해 자세히 알아보세요.

Google Cloud Storage에 직접 업로드할 때는 잠시 후에 설명하겠지만 특정 URL에 HTTP POST를 수행합니다. 그러면 App Engine이 특정 업로드 서비스를 사용하여 해당 포스트를 처리해서 파일을 Google Cloud Storage에 씁니다. 파일 쓰기가 완료되면 App Engine은 업로드가 완료되었다고 앱에 알려줍니다. 앱은 완료 시에만 호출되므로 이 메소드를 사용하여 현재 최대 100테라바이트의 매우 큰 파일을 업로드할 수 있습니다.

App Engine 앱에서 Google Cloud Storage에 쓰는 방식은 인스턴스 시간과 비용이 발생하기 때문에 사용자가 Google Cloud storage에 직접 파일을 업로드하는 방법이 이보다 더 빠르고 비용 면에서 효과적입니다. 또한 파일 쓰기는 애플리케이션에 대한 요청 내에서 이루어지지 않습니다. 따라서 다른 경우라면 적용되었을 요청 제한 시간이 없어 대용량 파일도 업로드할 수 있습니다.

파일 업로드 구현

사용자 파일 업로드를 구현하려면 다음 안내를 따르세요.

  1. CloudStorageTools 가져오기:

    use google\appengine\api\cloud_storage\CloudStorageTools;
  2. .php 파일에서 다음과 같이 CloudStorageTools::createUploadUrl() 메서드를 사용하여 애플리케이션별 업로드 URL을 만듭니다.

    $options = ['gs_bucket_name' => $my_bucket];
    $upload_url = CloudStorageTools::createUploadUrl('/upload/handler', $options);

    사용 가능한 옵션에 대한 자세한 내용은 createUploadUrl 옵션을 참조하세요. my_bucketYOUR_APP_ID입니다. 기본 버킷을 사용할 경우에는 REGION_ID.r.appspot.com입니다.

  3. 생성 후 10분 내에 이 URL에 업로드를 시작해야 한다는 점에 유의하세요. 또한 URL은 어떤 식으로도 변경할 수 없습니다. URL이 서명되고 서명이 확인된 후에 업로드가 시작되기 때문입니다.

  4. 이 URL은 업로드를 수락하는 데 사용하는 양식을 위한 조치로 사용합니다. 예:

    <form action="{{ upload_url }}" enctype="multipart/form-data" method="post">
        Files to upload: <br>
       <input type="file" name="uploaded_files" size="40">
       <input type="submit" value="Send">
    </form>

파일 업로드 후 createUploadUrl의 첫 번째 매개변수로 지정된 경로(위의 예시에서는 /upload_handler.php)에 POST가 수행됩니다. PHP 런타임은 올바른 $_FILES 수퍼 전역을 형성하고 tmp_filename은 Google Cloud Storage에 새로 업로드된 파일의 파일 이름을 가리킵니다.

예를 들어 upload_handler.php의 콘텐츠가 다음과 같다고 가정해 보겠습니다.

var_dump($_FILES);

hello.txt라는 파일을 업로드하면 다음과 같이 출력됩니다.

array(1) {
  ['uploaded_files']=>
  array(5) {
    ['name']=>    string(14) 'hello.txt'
    ['type']=>    string(10) 'text/plain'
    ['tmp_name']=>    string(73) 'gs://my_bucket/L2FwcHMtdXBsb2FkL2Jsb2JzL2IxNUFBVGNJNXNTd0VqR0tFSUtDRGxadGc'
    ['error']=>    int(0)
    ['size']=>    int(1452)
  }
}

업로드가 완료되면 gs:// 스트림 래퍼를 사용하여 업로드된 파일을 읽을 수 있습니다. 업로드된 다른 파일에서 일반적으로 사용하는 move_uploaded_file을 사용합니다. 예를 들면 다음과 같습니다.

$file_name = $_FILES['uploaded_files']['name'];
$temp_name = $_FILES['uploaded_files']['tmp_name'];
move_uploaded_file($temp_name, "gs://${my_bucket}/${file_name}.txt");

createUploadUrl 옵션

유효한 createUploadUrl 옵션은 다음 표에 나와 있습니다.

옵션 설명
max_bytes_per_blob 정수. 기본값은 unlimited입니다. 업로드된 blob에 허용되는 가장 큰 값입니다.
max_bytes_total 정수. 기본값은 unlimited입니다. 업로드된 모든 blob의 전체 크기입니다.
gs_bucket_name 문자열. blob이 업로드되어야 하는 Google Cloud Storage 버킷의 이름입니다. 값을 지정하지 않으면 blob이 애플리케이션의 기본 버킷에 업로드됩니다.