uploadFile method

Future<GoogleFile> uploadFile({
  1. required List<int> data,
  2. required String mimeType,
  3. required String displayName,
})

Upload a file to Google AI Files API

Implementation

Future<GoogleFile> uploadFile({
  required List<int> data,
  required String mimeType,
  required String displayName,
}) async {
  try {
    // Create file metadata
    final metadata = {
      'file': {
        'displayName': displayName,
        'mimeType': mimeType,
      }
    };

    // Create multipart form data
    final formData = FormData.fromMap({
      'metadata': jsonEncode(metadata),
      'data': MultipartFile.fromBytes(
        data,
        filename: displayName,
      ),
    });

    final response = await client.dio.post(
      'upload/v1beta/files?key=${config.apiKey}',
      data: formData,
      options: Options(
        headers: {
          'X-Goog-Upload-Protocol': 'multipart',
        },
      ),
    );

    if (response.statusCode != 200) {
      final errorMessage = response.data?['error']?['message'] ??
          'File upload failed: ${response.statusCode}';
      throw ProviderError(errorMessage);
    }

    final fileData = response.data['file'] as Map<String, dynamic>;
    final uploadedFile = GoogleFile.fromJson(fileData);

    // Cache the uploaded file
    final cacheKey = '${displayName}_${data.length}_$mimeType';
    _fileCache[cacheKey] = uploadedFile;

    return uploadedFile;
  } on DioException catch (e) {
    throw _handleDioError(e);
  } catch (e) {
    throw GenericError('File upload error: $e');
  }
}