uploadFile method

Future<String> uploadFile(
  1. String path,
  2. String partId, {
  3. String? fileName,
  4. String? componentType,
  5. String? componentName,
  6. String? methodName,
  7. Map<String, Any>? methodParameters,
  8. Iterable<String> tags = const [],
})

Upload a file from its path to Viam's Data Manager

The file name can be overridden by providing the fileName parameter.

import 'package:file_picker/file_picker.dart';
import 'package:cross_file/cross_file.dart';

_viam = await Viam.withApiKey(
     dotenv.env['API_KEY_ID'] ?? '',
     dotenv.env['API_KEY'] ?? ''
);
final dataClient = _viam.dataClient;

// File picker function
Future<XFile?> pickTextFile() async {
  FilePickerResult? result = await FilePicker.platform.pickFiles(
    type: FileType.custom,
    allowedExtensions: ['txt', 'md', 'json', 'csv'],  // Add any other text file extensions you want to support
  );
 if (result != null) {
   return XFile(result.files.single.path!);
 }
   return null;
 }

// Upload text file function. Call this in onPressed in a button in your application.
Future<void> uploadTextFile() async {
  final file = await pickTextFile();
  if (file == null) return;

  try {
    // Get file name
    final fileName = file.name;

    // Upload the file
    final result = await _viam.dataClient.uploadFile(
      file.path,
      fileName: fileName,
      "<YOUR-PART-ID>",
      tags: ["text_file", "document"]
    );
    print('Upload success: $result');
  } catch (e) {
    print('Upload error: $e');
  }
 }

For more information, see Data Client API.

Implementation

Future<String> uploadFile(String path, String partId,
    {String? fileName,
    String? componentType,
    String? componentName,
    String? methodName,
    Map<String, Any>? methodParameters,
    Iterable<String> tags = const []}) async {
  final fileNameAndExt = path.split(Platform.pathSeparator).last;
  String fName, ext;
  if (fileNameAndExt.contains('.')) {
    fName = (fileNameAndExt.split('.')..removeLast()).join('.');
    ext = '.${fileNameAndExt.split('.').last}';
  } else {
    fName = fileNameAndExt;
    ext = '';
  }
  final metadata = UploadMetadata()
    ..partId = partId
    ..type = DataType.DATA_TYPE_FILE
    ..fileName = fileName ?? fName
    ..fileExtension = ext
    ..tags.addAll(tags);
  if (componentType != null) metadata.componentType = componentType;
  if (componentName != null) metadata.componentName = componentName;
  if (methodName != null) metadata.methodName = methodName;
  if (methodParameters != null) metadata.methodParameters.addAll(methodParameters);
  final metadataStream = Stream.value(FileUploadRequest()..metadata = metadata);

  final file = File(path);
  final reader = ChunkedStreamReader(file.openRead());
  try {
    final fileDataStream =
        reader.readStream(file.lengthSync()).map((event) => FileUploadRequest()..fileContents = (FileData()..data = event));
    final requestStream = StreamGroup.merge([metadataStream, fileDataStream]);
    final response = await _dataSyncClient.fileUpload(requestStream);
    return response.fileId;
  } finally {
    await reader.cancel();
  }
}