flutter inappwebview render html file downloaded from - flutter

I'm trying to create an application using
flutter_inappwebview: ^6.0.0-beta.14
base on the the following steps:
download html zipfile from internet.
extract on local storage (at path getting from getApplicationDocumentsDirectory())
use flutter_inappwebview to run localhost server and try to set the documentRoot to the path of getApplicationDocumentsDirectory()
but it show the blank screen and it seems like it cannot find the html file that was extracted. I've explored the directory and already see the html files and folder on that path.
But if I create an html file inside assets folder and run localhost server and access http://localhost:8080/index.html, it was success. But what I want is download html from internet
final dir = (await getApplicationDocumentsDirectory()).path;
final zippedFile = File('$dir/html.zip');// downloaded from internet
await zippedFile.writeAsBytes(zip.data);
final bytes = await zippedFile.readAsBytes();
final archive = ZipDecoder().decodeBytes(bytes);
for (final file in archive) {
final fileName = '$dir/${file.name}';
if (file.isFile && !fileName.contains("__MACOSX")) {
debugPrint(fileName);
final outFile = File(fileName);
await outFile.create(recursive: true);
await outFile.writeAsBytes(file.content);
}
}
and here is code to run localhost server
final dir = (await getApplicationDocumentsDirectory()).path;
final localhostServer = InAppLocalhostServer(
port: 8080,
documentRoot: $dir
);
if (!localhostServer.isRunning()) {
await localhostServer.start();
debugPrint('LOCALHOSTSERVER STARTED');
}

Related

Unhandled Exception: FileSystemException: Cannot open file, path ... (OS Error: No such file or directory, errno = 2)

I'm trying to download *.xlsx file using dio.download, and it's throwing the errors:
Unhandled Exception: FileSystemException: Cannot open file, path = '/storage/emulated/0/Android/data/com.example.foodagator_app/files/file.xlsx' (OS Error: No such file or directory, errno = 2)
Another one error from try/catch block:
FileSystemException: Creation failed, path = 'File: '' (OS Error: Read-only file system, errno = 30)
I wrote the permission in androidmanifest for external storage, and also tried temporary directory, but it's not working. Can anyone help me with this? Here is my code
void download() async {
var tempDir = await getExternalStorageDirectory();
File file = File(tempDir!.path + '/file.xlsx');
try {
Response response = await dio.download(
url,
file,
options: Options(
responseType: ResponseType.bytes,
followRedirects: false,
),
);
var raf = file.openSync(mode: FileMode.write);
// response.data is List<int> type
raf.writeFromSync(response.data);
await raf.close();
} catch (e) {
print('Error is: $e');
}
}
void readFile() async {
var tempDir = await getExternalStorageDirectory();
var filePath = tempDir!.path + "/file.xlsx";
var bytes = File(filePath).readAsBytesSync();
var decoder = SpreadsheetDecoder.decodeBytes(bytes, update: true);
for (var table in decoder.tables.keys) {
print(table);
print(decoder.tables[table]!.maxCols);
print(decoder.tables[table]!.maxRows);
for (var row in decoder.tables[table]!.rows) {
print('$row');
}
}
}
This error is getting because there is no file named file.xlsx you can check if file exists or not
if(file.existsSync())
if file does not exist, you can create one using,
new File('$path/file.xlsx').create(recursive: true);
in android 11 and higher use below permission, without tools:ignore="ScopedStorage"
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
In my case, it was caused because I had moved a dart file to another folder but my other files were still referencing that file using the old path, you can import the file again using the new path and using the "package:" keyword to solve this error.
Moral: Don't use relative paths to import a file anywhere in your project, always use the "package:" scheme.
You could make a custom name as well.
String createDownloadDocName(){
return'${fileName}-${DateTime.now().microsecond}';
}
Sorry, I had problem with await usage - I tried to get access to file before I downloaded it

Flutter Downloader: download file from URL with spaces

I'm using Flutter Downloader to download PDF files from an API. On Android I have no issues with the plugin, but on iOS, when the file download URL comes with a space, the file is not downloaded.
final status = await Permission.storage.request();
if (status.isGranted) {
final fileType = widget.billet.uRL.split(".").last;
final rng = Random();
final externalDir = Platform.isIOS
? Platform.isIOS
? await getApplicationDocumentsDirectory()
: await getExternalStorageDirectory()
: await getExternalStorageDirectory();
await FlutterDownloader.enqueue(
url: 'https://${widget.billet.uRL}',
savedDir: externalDir.path,
fileName: '${rng.nextInt(1000).toString()}_boleto_MF7.$fileType',
openFileFromNotification: true,
showNotification: true,
);
} else {
print('No download permission');
}
Example:
File is successfully downloaded: https://company.com/arq/file_123.pdf
File is NOT downloaded successfully: https://company.com/arq/file 123.pdf
When I try to download a file on iOS with the URL with a space, I get the following alert on the console:
"Error retrieving thread information (os/kern) invalid argument"
Is there a way to pass the URL with a space?
It's likely that the URL with spacing wasn't encoded properly which why the download request fails. What you can do here is encode the URL with Uri.encodeFull(url);

upload files with ionic file transfer

Hello I would like to know if someone can help me, I want to upload files to my server on localhost with ionic using filetransfer, I have no idea how to do it. Can somebody help me? Thanks.
In the preferred Pdfs, but it can be any type of files
First you need to select a file (an image from your gallery, or a pdf as you say). Then having the path to that file:
const fileTransfer: FileTransferObject = this.transfer.create();
const options: FileUploadOptions = {
fileKey: 'file',
fileName: 'uploadfile', // Name received in the server,
mimeType: 'image/jpeg', // or application/pdf for pdf
headers: {...} // (Optional) if needed
};
fileTransfer.upload( filename, url, options ).then( response => {
// Response here
}).catch(err => {
// Error here
});
Filename is the path to the file in your device (the selected pdf file) and url is the url to your server where you are uploading.

How to create a Postman server mock for uploading file and doing some uploading test of Flutter code?

I'm trying to connect to a printer server to be able to save the printing files directly in the printer storage. I'm able to do it using the curl
curl -v -H 'Content-Type:application/octet-stream' 'http://192.168.1.125/upload?X-Filename=model.gcode' --data-binary #model.gcode
Now I'm trying to add this function to a Flutter app but don't works....
So now I am trying to debug the code using a postman server.
Can you help me to create a postman server mock to upload the file as binary, like in this curl code?
curl -v -H 'Content-Type:application/octet-stream' 'http://192.168.1.125/upload?X-Filename=model.gcode' --data-binary #model.gcode
I want to create it because I want to test this Flutter code witch isn't working in the server of the printer.
FLUTTER CODE:
Future<void> uploadFile(File file) async {
///Using HTTP Package
Map<String, String> headers = {
"Content-type": "application/octet-stream",
};
var stream = new http.ByteStream(DelegatingStream.typed(file.openRead()));
var length = await file.length();
var uri = Uri.parse("http://192.168.1.125/upload?X-Filename=nupo.gcode");
var request = new http.MultipartRequest("POST", uri);
var multipartFile = new http.MultipartFile('application', stream, length,
filename: file.path);
request.headers.addAll(headers);
request.files.add(multipartFile);
var response = await request.send();
print(response.statusCode);
response.stream.transform(utf8.decoder).listen((value) {
print(value);
});
}
The server should be able to receive binary file and the command should be upload?X-Filename=filename.gcode, X-Filename is the command to give the name.
(this files are 3D printing files so .gcode is the enstention of motor command)
Postman is not a server usable for this scope. You can use it only for testing an existing server. Best practice with postman or visiti [POstman support][1]

Unhandled Exception: FileSystemException

When I upload .zip file or .docx ,it deos not work ,but when I choose .c files they work fine
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: FileSystemException: Failed to decode data using encoding 'utf-8', path = '/storage/emulated/0/New Text Document.zip'
File _file;
Future upload() async {
if (_file == null) { return; }
String path = _file.path.split("/").last;
var pdf = _file.readAsStringSync();
var url ="http://192.168.1.112/flutter/upload_file.php";
var data = { "path": path, "pdf": pdf };
var response = await http.post(url, body: data);
}
Future pickFile() async {
final myfile = await FilePicker.getFile();
setState(() {
_file = File(myfile.path);
});
}
Here is my php file I tried to use readAsBytesSync and it gave me error
<?php
include 'connection.php';
include 'register.php';
$pdf = $_POST['pdf'];
$file_name = $_POST['path'];
file_put_contents("uploads\\".$file_name, $pdf);
?>
_file.readAsStringSync()
This assumes that your file is plain text. A *.c file most likely is. Neither zip, nor doc nor pdf files are.
What you need to do is read your file as bytes:
var contents = _file.reasAsBytesSync();
Now, I don't know what your API expects to get, so I cannot really help you with how to get the bytes transferred. But this is the way to go.