Reputation: 9109
I would like to use a placeholder image file that I've added to my code as "assets/placeholder.png"
, but I'm getting a File not found error. This is how I'm doing it from the dartlang documentation...
var bytes = await new File('assets/placeholder.png').readAsBytes();
String base64 = CryptoUtils.bytesToBase64(bytes);
The bytes
variable errors every time. How can I save the bytes of a locally saved image file?
Upvotes: 29
Views: 79953
Reputation: 594
import 'dart:convert';
import 'package:flutter/services.dart';
...
ByteData byteData = await rootBundle.load('assets/image.png');
Uint8List bytes = byteData.buffer.asUint8List();
String base64Image = base64.encode(bytes);
Upvotes: 12
Reputation: 3409
if need read some bytes, use this
Future<Uint8List> readFileBytes(String path, int len) async {
final File file = File(path);
RandomAccessFile fileOpen = await file.open(mode: FileMode.read);
int count = 0;
List<int> bytes = [];
int byte;
while (byte != -1 && count < len) {
byte = fileOpen.readByteSync();
bytes.add(byte);
count++;
}
await fileOpen.close();
return Uint8List.fromList(bytes);
}
Upvotes: 1
Reputation: 52366
Here is an example to read file byte by byte:
import 'dart:io';
void main(List<String> arguments) {
readFileByteByByte().then((done) {
print('done');
});
print('waiting...');
print('do something else while waiting...');
}
Future<bool> readFileByteByByte() async {
//final fileName = 'C:\\code\\test\\file_test\\bin\\main.dart'; // use your image file name here
final fileName = Platform.script.toFilePath(); //this will read this text file as an example
final script = File(fileName);
final file = await script.open(mode: FileMode.read);
var byte;
while (byte != -1) {
byte = await file.readByte();
if (byte == ';'.codeUnitAt(0)) { //check if byte is semicolon
print(byte);
}
}
await file.close();
return (true);
}
Upvotes: 2
Reputation: 872
In dart Uint8List is equal to byte[].
Create one function and pass file path, It will return Bytes.
Future<Uint8List> _readFileByte(String filePath) async {
Uri myUri = Uri.parse(filePath);
File audioFile = new File.fromUri(myUri);
Uint8List bytes;
await audioFile.readAsBytes().then((value) {
bytes = Uint8List.fromList(value);
print('reading of bytes is completed');
}).catchError((onError) {
print('Exception Error while reading audio from path:' +
onError.toString());
});
return bytes;
}
Now call the function in to get bytes of file.
try{
Uint8List audioByte;
String myPath= 'MyPath/abc.png';
_readFileByte(myPath).then((bytesData) {
audioByte = bytesData;
//do your task here
});
} catch (e) {
// if path invalid or not able to read
print(e);
}
If you want base64String then use below code:
String audioString = base64.encode(audioByte);
for base64 import 'dart:convert';
I hope it will help!
Upvotes: 19
Reputation: 5894
With Flutter environment, you have to use AssetBundle
if you want to access to your assets (https://flutter.io/assets-and-images/).
import 'package:flutter/services.dart' show rootBundle;
ByteData bytes = await rootBundle.load('assets/placeholder.png');
Upvotes: 43