Effacer les filtres
Effacer les filtres

How to know whether it is an image or a website with a given url?

3 vues (au cours des 30 derniers jours)
Salad Box
Salad Box le 21 Nov 2017
Commenté : Guillaume le 22 Nov 2017
Hi
I have a few urls, each of which begin with 'http://' and end with '.jpg'.
Some lead to images and others lead to websites (e.g. the above url).
Is there a way to know whether each url leads to an image or a website? If it leads to an image, save it; if it leads to a website, do nothing.
Can anyone help?

Réponse acceptée

Guillaume
Guillaume le 22 Nov 2017
Modifié(e) : Guillaume le 22 Nov 2017
The way matlab (or any other web client) determine the type content of a uri is by looking at the Content-Type property returned in the header of the get (or post) request that matlab (or any other web client) send when you request that page. All of this is hidden from you by webread and websave.
Since R2016b, matlab gives you functions to get down to the nitty gritty of the http protocol. The following should work:
queryurl = 'http://anguerde.com/pics/main/2/218886-active.jpg'; %replace as required
uri = matlab.net.URI(queryuri);
request = matlab.net.http.RequestMessage;
response = request.send(uri);
contenttype = response.Header.getFields('Content-Type');
If the uri points to an image, then Content-Type should contain 'image/something', so you could do
isimage = contains(contenttype.Value, 'image/')
Note that if you need to pass query parameters, or log into the web page, or some other things, there's a lot more work that needs to be performed before the above would work.

Plus de réponses (2)

Rik
Rik le 21 Nov 2017
Would websave give an error if you try to save a page as a single file (didn't test)? In that case you could just use a try-catch-block. If not, you can just save it, and do some operations that will only work on images (like imread), wrapping that in a try-catch-block.
  1 commentaire
Salad Box
Salad Box le 22 Nov 2017
Unfortunately websave didn't give an error. As all my urls look like the example shown above, and I named all the filename something like 'apple01.jpg', or 'apple02.jpg', therefore, in case the url is an image, websave will save it as a '.jpg' file; in case the url is a website, websave will save it as a '.html' file, so I will get the file name look like 'apple01.jpg.html'. Websave saves anything on the web, if its an image, it saves the image, if its a website, websave saves the whole website. Maybe that's why its called websave not imagesave. So no it didn't give any errors, instead it just save the web.

Connectez-vous pour commenter.


Image Analyst
Image Analyst le 22 Nov 2017
Try imread(). If it throws an error, it's not an image.
filename = 'http://anguerde.com/pics/main/2/218886-active.jpg';
try
rgbImage = imread(filename)
imshow(rgbImage); % Or whatever you plan on doing with the image
catch ME
fprintf('Sorry, but %s is a website, not an image.\n', filename);
end
If you don't want to view or save the image (or try to), then Guillaume's way is more direct, and maybe faster.
  1 commentaire
Guillaume
Guillaume le 22 Nov 2017
You could also simply check the extension returned by websave. In both case, the whole page is downloaded and saved to disk ( imread calls websave anyway) so yes this is going to be slower than my method. What imread (or checking the extension returned by websave) got going for it is that it's a lot more error proof than my method.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Call Web Services from MATLAB Using HTTP dans Help Center et File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by