[flutter] 플러터에서 앱 외부 저장소에 파일 저장하기

안드로이드와 iOS 모두 플러터에서는 앱 외부 저장소에 파일을 저장할 수 있습니다. 앱 외부 저장소는 사용자가 앱에 접근하지 않아도 파일에 접근할 수 있는 공용 공간입니다. 이 글에서는 플러터에서 앱 외부 저장소에 파일을 저장하는 방법을 알아보겠습니다.

1. permission_handler 패키지 추가하기

먼저, 앱 외부 저장소에 접근하기 위해서는 permission_handler 패키지를 추가해야 합니다. pubspec.yaml 파일에 다음과 같이 패키지를 추가해주세요:

dependencies:
  flutter:
    sdk: flutter
  permission_handler: ^12.0.0

2. 앱 사용자에게 권한 요청하기

안드로이드에서는 WRITE_EXTERNAL_STORAGE 권한을 획득해야 앱 외부 저장소에 파일을 저장할 수 있습니다. iOS에서는 별도의 권한 요청이 필요하지 않습니다.

import 'package:permission_handler/permission_handler.dart';

Future<void> requestPermission() async {
  PermissionStatus status = await Permission.storage.request();
  if (status.isDenied) {
    // 권한이 거부되었을 때
  } else if (status.isGranted) {
    // 권한이 승인되었을 때
  }
}

3. 파일 저장하기

사용자로부터 권한을 받고나면, 플러터에서 파일을 저장할 수 있습니다. 다음은 텍스트 파일을 저장하는 예제입니다.

import 'dart:io';
import 'path_provider/path_provider.dart';

Future<void> saveFile(String fileName, String content) async {
  Directory? directory = await getExternalStorageDirectory();
  if (directory != null) {
    File file = File("${directory.path}/$fileName");
    await file.writeAsString(content);
  }
}

위 예제 코드에서는 path_provider 패키지를 이용하여 외부 저장소의 디렉토리 경로를 얻고, 해당 경로에 파일을 생성하고 내용을 저장합니다.

4. 예외 처리하기

파일 저장을 할 때는 파일 생성 및 쓰기에 실패할 수 있는 예외 상황을 항상 처리해야 합니다. 위 코드에서는 directorynull이면 파일을 저장하지 않고 있습니다. 필요에 따라 예외 처리를 추가로 구현해주세요.

import 'dart:io';
import 'path_provider/path_provider.dart';

Future<void> saveFile(String fileName, String content) async {
  try {
    Directory? directory = await getExternalStorageDirectory();
    if (directory != null) {
      File file = File("${directory.path}/$fileName");
      await file.writeAsString(content);
    } else {
      // 디렉토리를 찾을 수 없음
    }
  } catch (e) {
    // 예외 처리
  }
}

마무리

이제 플러터에서 앱 외부 저장소에 파일을 저장하는 방법을 알아봤습니다. 사용자에게 권한을 요청하고 나서 path_provider 패키지를 이용하여 디렉토리 경로를 얻어 파일을 생성하고 내용을 저장할 수 있습니다. 파일 저장 시 예외 처리를 추가하면 안정적인 앱 개발이 가능합니다.