Docs Menu
Docs Home
/ / /
PHP 라이브러리 매뉴얼
/

대용량 파일 저장

이 페이지의 내용

  • 개요
  • GridFS 작동 방식
  • GridFS 버킷 만들기
  • 버킷 사용자 지정
  • 파일 업로드
  • 업로드 스트림에 쓰기
  • 기존 스트림 업로드
  • 파일 정보 검색
  • 예제
  • 파일 다운로드
  • 다운로드 스트림에서 읽기
  • 파일 수정본 다운로드
  • 기존 스트림에 다운로드
  • 파일 이름 바꾸기
  • 파일 삭제
  • API 문서

이 가이드 에서는 GridFS 를 사용하여 MongoDB 에 대용량 파일을 저장 하고 조회 하는 방법을 학습 수 있습니다. GridFS 는 MongoDB PHP 라이브러리에서 구현한 사양으로, 파일을 저장할 때 청크로 분할 하고 검색할 때 다시 조립하는 방법을 설명합니다. 라이브러리의 GridFS 구현 은 파일 저장 의 운영 및 조직 을 관리하는 추상화입니다.

파일 크기가 BSON 문서 크기 제한인 16MB를 초과하는 경우 GridFS 를 사용하세요. GridFS 가 사용 사례 에 적합한지 여부에 대한 자세한 내용은 MongoDB Server 매뉴얼에서 GridFS 를 참조하세요.

GridFS는 파일 청크와 파일을 설명하는 정보가 들어 있는 MongoDB 컬렉션 그룹인 버킷에 파일을 구성합니다. 버킷에는 GridFS 사양에 정의된 규칙을 사용하여 명명된 다음 컬렉션이 포함되어 있습니다.

  • chunks 컬렉션은 바이너리 파일 청크를 저장합니다.

  • files 0} 컬렉션에 파일 메타데이터가 저장됩니다.

새 GridFS 버킷을 생성하면 라이브러리는 다른 이름을 지정하지 않는 한 기본값 버킷 이름 fs 접두사 앞에 앞의 컬렉션을 생성합니다. 또한 파일 및 관련 메타데이터 를 효율적으로 검색할 수 있도록 각 컬렉션 에 인덱스 를 생성합니다. 라이브러리는 GridFS 버킷이 존재하지 않는 경우 첫 번째 쓰기 (write) 작업이 수행될 때만 생성합니다. 라이브러리는 인덱스가 존재하지 않거나 버킷이 비어 있는 경우에만 인덱스를 생성합니다. GridFS 인덱스에 대한 자세한 내용은 MongoDB Server 매뉴얼에서 GridFS 인덱스 를 참조하세요.

GridFS 를 사용하여 파일을 저장 때 라이브러리는 파일을 작은 청크로 분할하며, 각 chunks 청크는 컬렉션 에서 별도의 문서 로 표시됩니다. 또한 컬렉션 files 에 파일 ID, 파일 이름 및 기타 파일 메타데이터 가 포함된 문서 를 만듭니다. 스트림 을 MongoDB PHP 라이브러리에 전달하여 소비하거나 새 스트림 을 생성하고 직접 작성하여 파일 을 업로드할 수 있습니다. 스트림에 학습 보려면 스트림 참조하세요. PHP 매뉴얼에서 확인할 수 있습니다.

다음 다이어그램을 보고 버킷에 업로드할 때 GridFS 가 파일을 분할하는 방법을 확인할 수 있습니다.

GridFS가 파일을 버킷에 업로드하는 방법을 보여주는 다이어그램입니다.

파일을 검색할 때 GridFS 는 지정된 버킷의 files 컬렉션 에서 메타데이터 를 가져오고 이 정보를 사용하여 chunks 컬렉션 의 문서에서 파일 을 재구성합니다. 파일 내용을 기존 스트림 에 쓰거나 파일 을 가리키는 새 스트림 을 만들어 파일 을 읽을 수 있습니다.

GridFS 에서 파일을 저장 하거나 조회 하려면 데이터베이스 에서 MongoDB\Database::selectGridFSBucket() 메서드를 호출합니다. 이 메서드는 기존 버킷에 액세스하거나 버킷이 없는 경우 새 버킷을 생성합니다.

다음 예시 에서는 db 데이터베이스 에서 selectGridFSBucket() 메서드를 호출합니다.

$bucket = $client->db->selectGridFSBucket();

옵션 값을 지정하는 배열 을 selectGridFSBucket() 메서드에 전달하여 GridFS 버킷 구성을 사용자 지정할 수 있습니다. 다음 표에서는 배열 에서 설정하다 수 있는 몇 가지 옵션을 설명합니다.

옵션
설명
bucketName
Specifies the bucket name to use as a prefix for the files and chunks collections. The default value is 'fs'.
Type: string
chunkSizeBytes
Specifies the chunk size that GridFS splits files into. The default value is 261120.
Type: integer
readConcern
Specifies the read concern to use for bucket operations. The default value is the database's read concern.
Type: MongoDB\Driver\ReadConcern
readPreference
Specifies the read preference to use for bucket operations. The default value is the database's read preference.
Type: MongoDB\Driver\ReadPreference
writeConcern
Specifies the write concern to use for bucket operations. The default value is the database's write concern.
Type: MongoDB\Driver\WriteConcern

다음 예시 에서는 bucketName 옵션을 설정하는 selectGridFSBucket() 에 배열 을 전달하여 'myCustomBucket' 이라는 이름의 버킷을 만듭니다.

$custom_bucket = $client->db->selectGridFSBucket(
['bucketName' => 'myCustomBucket']
);

다음 방법을 사용하여 GridFS 버킷에 파일을 업로드할 수 있습니다.

  • MongoDB\GridFS\Bucket::openUploadStream(): 파일 콘텐츠를 쓰기 (write) 수 있는 새 업로드 스트림 을 엽니다.

  • MongoDB\GridFS\Bucket::uploadFromStream(): 기존 스트림 의 콘텐츠를 GridFS 파일 에 업로드합니다.

openUploadStream() 메서드를 사용하여 지정된 파일 이름에 대한 업로드 스트림 을 만듭니다. openUploadStream() 메서드를 사용하면 매개 변수로 전달할 수 있는 옵션 배열 에 구성 정보를 지정할 수 있습니다.

이 예시 에서는 업로드 스트림 을 사용하여 다음 조치를 수행합니다.

  • 다음 이름의 새 GridFS 파일 에 대한 쓰기 가능한 스트림 을 엽니다. 'my_file'

  • 배열 매개변수의 metadata 옵션을 openUploadStream() 메서드로 설정합니다.

  • fwrite() 메서드를 호출하여 스트림 이 가리키는 'my_file' 에 데이터를 쓰기 (write) .

  • fclose() 메서드를 호출하여 'my_file'을(를) 가리키는 스트림 을 닫습니다.

$stream = $bucket->openUploadStream('my_file', [
'metadata' => ['contentType' => 'text/plain']
]);
fwrite($stream, 'Data to store');
fclose($stream);

uploadFromStream() 메서드를 사용하여 스트림 의 콘텐츠를 새 GridFS 파일 에 업로드합니다. uploadFromStream() 메서드를 사용하면 매개 변수로 전달할 수 있는 옵션 배열 에 구성 정보를 지정할 수 있습니다.

이 예에서는 다음 조치를 수행합니다.

  • fopen() 메서드를 호출하여 에 있는 파일 을 /path/to/input_file 바이너리 읽기(rb) 모드 에서 스트림 으로 엽니다.

  • uploadFromStream() 메서드를 호출하여 스트림 의 내용을 'new_file'이라는 GridFS 파일 에 업로드합니다.

$file = fopen('/path/to/input_file', 'rb');
$bucket->uploadFromStream('new_file', $file);

이 섹션에서는 GridFS 버킷의 files 컬렉션에 저장된 파일 메타데이터를 검색하는 방법을 알아볼 수 있습니다. 메타데이터에는 다음을 포함하여 참조하는 파일에 대한 정보가 포함됩니다.

  • 파일의 _id입니다.

  • 파일 이름

  • 파일의 길이/크기

  • 업로드 날짜 및 시간

  • 다른 정보를 저장할 수 있는 metadata 문서입니다.

GridFS 버킷에서 파일을 조회 하려면 MongoDB\GridFS\Bucket 인스턴스 에서 MongoDB\GridFS\Bucket::find() 메서드를 호출합니다. 이 메서드는 결과에 액세스 할 수 있는 MongoDB\Driver\Cursor 인스턴스 를 반환합니다. MongoDB PHP 라이브러리의 Cursor 객체에 학습 보려면 커서에서 데이터 액세스 가이드 를 참조하세요.

다음 코드 예시 는 GridFS 버킷의 파일에서 파일 메타데이터 를 조회 하고 인쇄하는 방법을 보여줍니다. foreach 루프를 사용하여 반환된 커서 를 반복하고 파일 업로드 예제에 업로드 된 파일의 내용을 표시합니다.

$files = $bucket->find();
foreach ($files as $file_doc) {
echo toJSON($file_doc), PHP_EOL;
}

find() 메서드는 다양한 쿼리 사양을 허용합니다. $options 매개변수를 사용하여 정렬 순서, 반환할 최대 문서 수, 반환하기 전에 건너뛸 문서 수를 지정할 수 있습니다. 사용 가능한 옵션 목록을 보려면 API 설명서를 참조하세요.

참고

앞의 예시 에서는 toJSON() 메서드를 호출하여 파일 메타데이터 를 다음 코드에 정의된 확장 JSON 으로 출력합니다.

function toJSON(object $document): string
{
return MongoDB\BSON\Document::fromPHP($document)->toRelaxedExtendedJSON();
}

다음 방법을 사용하여 GridFS 버킷에서 파일을 다운로드 할 수 있습니다.

  • MongoDB\GridFS\Bucket::openDownloadStreamByName() 또는 MongoDB\GridFS\Bucket::openDownloadStream(): 파일 내용을 읽을 수 있는 새 다운로드 스트림 을 엽니다.

  • MongoDB\GridFS\Bucket::downloadToStream(): 전체 파일 을 기존 다운로드 스트림 에 씁니다.

MongoDB\GridFS\Bucket::openDownloadStreamByName() 메서드를 사용하여 다운로드 스트림 을 생성하여 MongoDB database 에서 파일을 다운로드 할 수 있습니다.

이 예시 에서는 다운로드 스트림 을 사용하여 다음 조치를 수행합니다.

  • 업로드 스트림에 쓰기 예시 에서 업로드된 'my_file' GridFS 파일 을 선택하고 읽기 가능한 스트림 으로 엽니다.

  • stream_get_contents() 메서드를 호출하여 의 내용을 읽습니다.'my_file'

  • 파일 내용을 인쇄합니다.

  • fclose() 메서드를 호출하여 'my_file'을(를) 가리키는 다운로드 스트림 을 닫습니다.

$stream = $bucket->openDownloadStreamByName('my_file');
$contents = stream_get_contents($stream);
echo $contents, PHP_EOL;
fclose($stream);

참고

파일 이름이 같은 문서가 여러 개 있는 경우 GridFS 는 지정된 이름의 가장 최근 파일 을 스트림 합니다( uploadDate 필드 에 따라 결정됨).

또는 파일의 _id 필드를 매개변수로 사용하는 MongoDB\GridFS\Bucket::openDownloadStream() 메서드를 사용할 수 있습니다.

$stream = $bucket->openDownloadStream(new ObjectId('66e0a5487c880f844c0a32b1'));
$contents = stream_get_contents($stream);
fclose($stream);

참고

GridFS 스트리밍 API 는 부분 청크를 로드할 수 없습니다. 다운로드 스트림 은 MongoDB 에서 청크 를 가져와야 하는 경우 전체 청크 를 메모리로 가져옵니다. 일반적으로 255킬로바이트의 기본값 청크 크기로 충분하지만, 메모리 오버헤드 를 줄이기 위해 청크 크기를 줄이거나 더 큰 파일로 작업할 때 청크 크기를 늘릴 수 있습니다. 청크 크기 설정에 대한 자세한 내용은 이 페이지의 Customize Bucket (버킷 사용자 지정) 섹션을 참조하세요.

버킷에 동일한 파일 이름을 주식 하는 파일이 여러 개 포함된 경우 GridFS 는 기본값 가장 최근에 업로드된 버전의 파일 을 선택합니다. 동일한 이름을 공유하는 각 파일 을 구분하기 위해 GridFS 는 업로드 시간 순으로 수정본 번호를 할당합니다.

원래 파일 수정본 번호는 0 이고 그 다음으로 가장 최근의 파일 수정본 번호는 1 입니다. 수정본의 최신성에 해당하는 음수 값을 지정할 수도 있습니다. 수정본 값 -1 는 가장 최근의 수정본을 참조하고 -2 는 그 다음으로 최근의 수정본을 참조합니다.

옵션 배열 을 openDownloadStreamByName() 메서드에 전달하고 revision 옵션을 지정하여 특정 파일 수정본을 다운로드 하도록 GridFS 에 지시할 수 있습니다. 다음 예시 에서는 가장 최근의 수정본이 아닌 'my_file' 라는 이름의 원본 파일 의 내용을 읽습니다.

$stream = $bucket->openDownloadStreamByName('my_file', ['revision' => 0]);
$contents = stream_get_contents($stream);
fclose($stream);

버킷에서 MongoDB\GridFS\Bucket::downloadToStream() 메서드를 호출하여 GridFS 파일 의 콘텐츠를 기존 스트림 에 다운로드 할 수 있습니다.

이 예에서는 다음 조치를 수행합니다.

  • 메서드를 호출하여 에 있는 파일 을 바이너리 쓰기 fopen() /path/to/output_file wb(write) ( ) 모드 에서 스트림 으로 엽니다.

  • _id 값이 ObjectId('66e0a5487c880f844c0a32b1') 인 GridFS 파일 을 스트림 에 다운로드 합니다.

$file = fopen('/path/to/output_file', 'wb');
$bucket->downloadToStream(
new ObjectId('66e0a5487c880f844c0a32b1'),
$file,
);

MongoDB\GridFS\Bucket::rename() 메서드를 사용하여 버킷에 있는 GridFS 파일의 이름을 업데이트합니다. 파일 이름이 아닌 _id 필드로 이름을 바꾸도록 파일을 지정해야 합니다.

다음 예에서는 문서의 _id 필드를 참조하여 filename 필드를 'new_file_name' 로 업데이트하는 방법을 보여 줍니다.

$bucket->rename(new ObjectId('66e0a5487c880f844c0a32b1'), 'new_file_name');

참고

파일 수정본

rename() 메서드는 한 번에 하나의 파일 이름 업데이트만 지원합니다. 각 파일 수정본 또는 동일한 파일 이름을 주식 하는 업로드 시간이 다른 파일의 이름을 변경하려면 각 수정본의 _id 값을 수집합니다. 그런 다음 rename() 메서드에 대한 개별 호출로 각 값을 전달합니다.

버킷에서 파일의 컬렉션 문서와 관련 청크를 제거하려면 MongoDB\GridFS\Bucket::delete() 메서드를 사용합니다. 이렇게 하면 파일이 효과적으로 삭제됩니다. 파일 이름이 아닌 _id 필드로 파일을 지정해야 합니다.

다음 예제에서는 _id 필드를 참고하여 파일을 삭제하는 방법을 보여 줍니다.

$bucket->delete(new ObjectId('66e0a5487c880f844c0a32b1'));

참고

파일 수정본

delete() 메서드는 한 번에 하나의 파일 삭제만 지원합니다. 각 파일 수정본을 삭제 하거나 동일한 파일 이름을 주식 하는 업로드 시간이 다른 파일을 삭제하려면 각 수정본의 _id 값을 수집합니다. 그런 다음 delete() 메서드에 대한 개별 호출로 각 값을 전달합니다.

MongoDB PHP 라이브러리를 사용하여 대용량 파일을 저장 하고 조회 하는 방법에 학습 보려면 다음 API 설명서를 참조하세요.

돌아가기

거래 수행