Flutter get all images from website with given URL - flutter

I am trying to scrape any website for its images and save them in a list. For that I am using the getElementsByTagname("img") and also selected the ['src'] attributes like this:
void _getData() async {
final response = await http.get(Uri.parse(_currentUrl));
final host = Uri.parse(_currentUrl).host;
dom.Document document = parser.parse(response.body);
final elements = document.getElementsByTagName("img").toList();
for (var element in elements) {
var imageSource = element.attributes['src'] ?? '';
print(imageSource);
bool validURL = Uri.parse(imageSource).host == '' ||
Uri.parse(host + imageSource).host == ''
? false
: true;
if (validURL && !imageSource.endsWith('svg')) {
Uri imageSourceUrl = Uri.parse(imageSource);
if (imageSourceUrl.host.isEmpty) {
imageSource = host + imageSource;
}
if (_imagesWithSize.firstWhereOrNull(
(element) => element.imageUrl == imageSource,
) ==
null) {
Size size = await _calculateImageDimension(imageSource);
_imagesWithSize.add(
ImageWithSize(
imageSource,
size,
),
);
}
}
}
_imagesWithSize.sort(
(a, b) => (b.imageSize.height * b.imageSize.width).compareTo(
a.imageSize.height * a.imageSize.width,
),
);
}
Problem:
This does not work with this link:
HM Productlink
I get this URL:
//lp2.hm.com/hmgoepprod?set=quality%5B79%5D%2Csource%5B%2F0c%2Fe6%2F0ce67f87aa6691557f30371590cf854ed0fb77c7.jpg%5D%2Corigin%5Bdam%5D%2Ccategory%5B%5D%2Ctype%5BLOOKBOOK%5D%2Cres%5Bm%5D%2Chmver%5B1%5D&call=url[file:/product/main]
And this is not a valid URL...
How can I parse the image from this website?
Let me know if you need any more info!

Links with leading double slashes are valid in HTML, as part of RFC1808. They will be replaced by http or https depending on the context. It will probably work if you add the scheme (http: or https:) from _currentUrl to imageSourceUrl.
I have not tested this, but I assume something like this would work:
if (!imageSourceUrl.hasScheme) {
final scheme = Uri.parse(_currentUrl).scheme;
imageSourceUrl = imageSourceUrl.replace(scheme: scheme);
}

Related

Flutter - loop not working while parsing json

I am trying to create model and parse json data from api
for that i created the model class you can see below
class FeatureModel {
String? PlanFeatures;
bool? FeatureStatus;
FeatureModel({this.PlanFeatures, this.FeatureStatus});
FeatureModel.fromJson(parsonJson) {
PlanFeatures = parsonJson['PlanFeatures'];
FeatureStatus = parsonJson['FeatureStatus'];
}
}
now i am trying to parse json with the help of loop
let me show you my method
List<FeatureModel> featureModel = [];
Uri featureAPI = Uri.parse(
planFeatureApi);
apiCall() async {
try {
http.Response response = await http.get(featureAPI);
// print(response.statusCode);
if (response.statusCode == 200) {
var decode = json.decode(response.body);
print(decode);
for (var i = 0; i < decode.length; i++) {
print(i);
featureModel.add(
FeatureModel.fromJson(decode[i]),
);
}
}
} catch (e) {}
}
I am calling it here
onPressed: () async{
await apiCall();
}
but the problem is here
loop is not working while parsing data
in that particular code i remains on 0 only
when i removes featureModel.add( FeatureModel.fromJson(decode[i]), ); i started increaing till 10
please let me know if i am making any mistake or what
thanks in advance
Here is the sample of api respone
[{"PlanFeatures":"Video Link Sharing","FeatureStatus":"true"},{"PlanFeatures":"Email \u0026amp; Telephonic Support","FeatureStatus":"true"},{"PlanFeatures":"Remove Pixeshare Branding","FeatureStatus":"false"},{"PlanFeatures":"Add Custom logo on uploaded photos","FeatureStatus":"false"},{"PlanFeatures":"Get Visitor Info","FeatureStatus":"false"},{"PlanFeatures":"Mobile Apps","FeatureStatus":"false"},{"PlanFeatures":"Send Questionnaries","FeatureStatus":"false"},{"PlanFeatures":"Create \u0026amp; Send Quotation","FeatureStatus":"false"},{"PlanFeatures":"Online Digital Album Sharing","FeatureStatus":"false"},{"PlanFeatures":"Analytics","FeatureStatus":"false"}]
thanks
I found many errors, first, the fromJson is not a factory constructor and doesn't return a class instance from the JSON.
the second one is that the bool values from the sample you added are String not a bool so we need to check over it.
try changing your model class to this:
class FeatureModel {
String? PlanFeatures;
bool? FeatureStatus;
FeatureModel({this.PlanFeatures, this.FeatureStatus});
factory FeatureModel.fromJson(parsonJson) {
return FeatureModel(
PlanFeatures: parsonJson['PlanFeatures'],
FeatureStatus: parsonJson['FeatureStatus'] == "false" ? false : true,
);
}
}

Dart is replacing "&" with "\u0026" in a URL

I am using flutter to process a link and download it to the device using dio package.
But the problem is dart is replacing all '&' with '\u0026' and making the link unusable. is there a way to avoid this problem? Thanks in advance.
Here's the code:
const uuid = Uuid();
final Dio dio = Dio();
// * create random id for naming downloaded file
final String randid = uuid.v4();
// * create a local instance of state all media
List<MediaModel> allMedia = state.allMedia;
// * create an instance of IGDownloader utility class from ~/lib/utilities
final IGDownloader igd = IGDownloader();
// * make a download link from provided link from the GetNewMedia event
final link = await igd.getPost(event.link);
link.replaceAll('\u0026', '&');
print(await link);
Output:
// expected : "http://www.example.com/example&examples/"
// result: "http://www.example.com/example\u0026example"
Pass your url to cleanContent function and don't forget to add imports
import 'package:html/parser.dart';
import 'package:html_unescape/html_unescape.dart';
static String cleanContent(String content, {bool decodeComponent = false}) {
if (content.contains("<p>")) {
content = content.replaceAll("<p>", "").trim();
}
if (content.contains("</p>")) {
content = content.replaceAll("</p>", "").trim();
}
var unescape = HtmlUnescape();
content = unescape.convert(content).toString();
if (content.contains("\\<.*?\\>")) {
content = content.replaceAll("\\<.*?\\>", "").trim();
}
content = parseHtmlString(content,decodeComponent: decodeComponent);
return content;
}
static String parseHtmlString(String htmlString,{bool decodeComponent = false}) {
final document = parse(htmlString);
String parsedString = parse(document.body!.text).documentElement!.text;
if(parsedString.contains("%3A")){
parsedString = parsedString.replaceAll("%3A", ":");
}
if(parsedString.contains("%2F")){
parsedString = parsedString.replaceAll("%2F", "/");
}
if(decodeComponent){
parsedString = Uri.decodeComponent(parsedString);
}
return parsedString;
}
replaceAll returns the modified string, but leaves original String untouched.
Try:
print(await link.replaceAll('\u0026', '&'));
or
newLink = link.replaceAll('\u0026', '&');
print(await newLink);

Not able to upload image to server using flutter API integration

I am trying to send Form data to the backend using Flutter.
As a result, all the text type data is sent easily but my image file is not shared.
Help me Guys
uploadImage(
filepath,url) async {
EasyLoading.show(status: 'Uploading Data...');
try {
final result = await InternetAddress.lookup('example.com');
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
var request = http.MultipartRequest('POST', Uri.parse(url));
print(filepath); *// this filepath is not empty*
request.files.add(await http.MultipartFile.fromPath('image', filepath));
request.headers.addAll(headers);
request.fields['name'] = _pName.text;
request.fields['store_id'] = store_id;
request.fields['seller_name'] = seller_name;
request.fields['seller_id'] = seller_id;
request.fields['product_id'] = 35.toString();
request.fields['stock_status_id'] = 6.toString();
request.fields['price'] = _pPrice.text;
request.fields['model'] = _pModel.text;
request.fields['sku'] = _pSKU.text;
request.fields['status'] = 1.toString();
request.fields['product_name'] = "Shoes Sport";
request.fields['is_approved'] = 1.toString();
request.fields['special'] = false.toString();
request.fields['quantity'] = _pQuantity.text;
var res = await request.send();
if(res.statusCode==200)
{
EasyLoading.showSuccess('Data is Uploaded!\n Waiting For Approval');
EasyLoading.dismiss();
print(res.reasonPhrase);
Navigator.pop(context);
}
print(request.fields);
// print(filepath);
}
}
on SocketException catch (_) {
EasyLoading.showError("Internet Connection is not available");
}
}
all the data is uploaded except image, i have also crosschecked the parameter its correct.
chek the spelling of "image" it should be same mention in your api doc and the one you are using, your code seems correct i was stuck at the same issue i was using the image key but the key was "profile " please do a recheck , let me know if this works

Why Google Distance Matrix Api returning invalid request status? (using Flutter)

I am trying to call Distance Matrix API and every time I call it, it returns an invalid request, this is my code for calling request and parsing it
output:
{destination_addresses: [], origin_addresses: [], rows: [], status: INVALID_REQUEST}
the function of requesting from the api:
Future<String> getDuration(LatLng l1, List<LatLng> l2) async {
var destinations = await _getwaypoints(l2);
String url =
"https://maps.googleapis.com/maps/api/distancematrix/json?
origin=${l1.latitude},${l1.longitude}&destination=$destinations&departure_time=now&key=$apiKey";
http.Response response = await http.get(url);
Map values = jsonDecode(response.body);
return values.toString();
_getwaypoints function which i use to format the list to be suitable for the request:
Future<String> _getwaypoints(List<LatLng> way) async {
String waypointcoords = '';
// Future<String> finalwaypoints;
if (way == null) {
return null;
} else {
for (int i = 0; i <= (way.length - 1); i++) {
var lat = way[i].latitude.toString();
var lon = way[i].longitude.toString();
if (i == 0) {
waypointcoords += '$lat%2C$lon';
} else {
waypointcoords += '%7C$lat%2C$lon ';
}
}
waypointcoords.trim();
return waypointcoords;
}
}
also, I tried to pass one origin location and one destination location and it was the same output,
why the return is invalid request statues while it still recognizes that its distance matrix API and returning empty destination_addresses, origin_addresses, and rows,
is there something I am doing wrong?
In the request URL, instead of origin and destination it must be origins and destinations

clean future builder for new data

i'm using a builder for a search page in my application, basically i get data from a json file,
my issue is that if i try to search for a new word, the old result will still be shown and the new one are going to be shown under them.
here is how i get data from my website:
Future<List<Note>> fetchNotes() async {
var url = 'https://sample.com/';
var response = await http.get(url + _controller.text.trim());
var notes = List<Note>();
if (response.statusCode == 200) {
var notesJson = json.decode(response.body);
for (var noteJson in notesJson) {
notes.add(Note.fromJson(noteJson));
}
} else {
ercode = 1;
}
return notes;
}
fetchNotes().then((value) {
setState(() {
_notes.addAll(value);
});
});
if (_notes[0] == null) {
ercode = 2;
}
}
and i display data like this:
here is full example for showing that data
I think you should use "clear()".
fetchNotes().then((value) {
setState(() {
_notes.clear();
_notes.addAll(value);
});
});