uploadFile method
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();
}
}