Comment vérifier si l'URL est une URL d'image qui doit être au format PNG, GIF, JPG
Je vois que cela peut être fait avec ce code:
URLConnection connection = new URL("http://foo.bar/w23afv").openConnection(); String contentType = connection.getHeaderField("Content-Type"); boolean image = contentType.startsWith("image/");
Mais, je dois vérifier en utilisant soit Glide
ou OKHttpClient
.
Comment y parvenir en utilisant les deux techniques mentionnées ci-dessus?
5 Réponses :
dans okHttpClient, vous devez utiliser la ligne ci-dessous comme URL et effectuer un appel API, si l'appel réussit, vous pouvez vérifier votre condition.
ex: -
String url = new URL("http://foo.bar/w23afv").toString(); OkHttpHandler okHttpHandler= new OkHttpHandler(); okHttpHandler.execute(url);
p >
Si vous obtenez la chaîne d'image. vous pouvez simplement vérifier cette URL d'image qui se termine par (jpg ou png) en utilisant cette méthode de format de chaîne.
imageString.endsWith("jpg") || imageString.endsWith("png")
Si vous êtes d'accord avec la requête HEAD
, je pense que Jeff Lockhart est la solution la plus propre. Quoi qu'il en soit, je poste ci-dessous une solution plus complète à propos de votre question:
Avec okhttp3
uniquement
Glide.with(this) .load("your tini url") .into(helloImageView);
Vous pourriez vérifier les en-têtes d'une requête HEAD
accédant également au corps ContentType.
Vérifiez les en-têtes
sur onResponse ()
strong>
@GlideModule public class OkHttpAppGlideModule extends AppGlideModule { @Override public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { super.applyOptions(context, builder); } @Override public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { OkHttpClient client = new OkHttpClient.Builder() .readTimeout(15, TimeUnit.SECONDS) .connectTimeout(15, TimeUnit.SECONDS) .addNetworkInterceptor(chain -> { Response _response = chain.proceed(chain.request()); int _httpResponseCode = _response.code(); if (_httpResponseCode == 301 || _httpResponseCode == 302 || _httpResponseCode == 303 || _httpResponseCode == 307) { return _response; // redirect } final ResponseBody _body = _response.body(); if (_body != null) { final MediaType _contentType = _body.contentType(); if (_contentType != null) { final String _mainType = _contentType.type(); // image final String _subtypeType = _contentType.subtype(); // jpeg/png/etc. Log.d("OKHTTP3 - media content type", _contentType.toString()); Log.d("OKHTTP3 - media main type", _mainType); Log.d("OKHTTP3 - media sub type", _subtypeType); boolean isImage = _mainType.equals("image"); Log.d("OKHTTP3 - I'VE GOT AN IMAGE", "" + isImage); if (isImage) { Log.d("OKHTTP3 WE HAVE AN IMAGE!", "yay!"); return _response; } else { return return415Response(chain); } } else { return return415Response(chain); } } else { return return415Response(chain); } }).build(); OkHttpUrlLoader.Factory factory = new OkHttpUrlLoader.Factory(client); registry.replace(GlideUrl.class, InputStream.class, factory); } private Response return415Response(Interceptor.Chain chain) { return new Response.Builder() .code(415) // Media type not supported... or whatever .protocol(Protocol.HTTP_1_1) .message("Media type not supported") .body(ResponseBody.create(MediaType.parse("text/html"), "")) .request(chain.request()) .build(); }
Vérifiez les en-têtes
avec interceptor
:
Les intercepteurs sont utiles car ils se centralisent en un seul endroit où vous vérifiez votre URL.
implementation 'com.github.bumptech.glide:glide:4.9.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' implementation 'com.github.bumptech.glide:annotations:4.9.0' implementation "com.github.bumptech.glide:okhttp3-integration:4.9.0"
Utilisation de Glide v4 code >
avec okhttp3
OkHttpClient clientWithInterceptor = new OkHttpClient.Builder() .addInterceptor(chain -> { Response _response = chain.proceed(request); final ResponseBody _body = _response.body(); if (_body != null) { final MediaType _contentType = _body.contentType(); if (_contentType != null) { final String _mainType = _contentType.type(); // image final String _subtypeType = _contentType.subtype(); // jpeg/png/etc. Log.d("OKHTTP3 - media content type", _contentType.toString()); Log.d("OKHTTP3 - media main type", _mainType); Log.d("OKHTTP3 - media sub type", _subtypeType); boolean isImage = _mainType.equals("image"); Log.d("OKHTTP3 - I'VE GOT AN IMAGE", "" + isImage); if (isImage) { return _response; } else { return return415Response(chain); } } else { return return415Response(chain); } } else { return return415Response(chain); } }).build(); clientWithInterceptor.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); Log.d("OKHTTP3 onFailure", e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { Log.d("OKHTTP3 - onResponse", "" + response.toString()); if (response.isSuccessful()) { final InputStream inputStream = response.body().byteStream(); final Bitmap bitmap = BitmapFactory.decodeStream(inputStream); runOnUiThread(() -> { helloImageView.setImageBitmap(bitmap); }); } } }); //*/ } private Response return415Response(Interceptor.Chain chain) { return new Response.Builder() .code(415) // Media type not supported... or whatever .protocol(Protocol.HTTP_1_1) .message("Media type not supported") .body(ResponseBody.create(MediaType.parse("text/html"), "")) .request(chain.request()) .build(); }
Vous devez étendre GlideAppModule code>
OkHttpClient client = new OkHttpClient(); Request requestHead = new Request.Builder() .url("your tiny url") .head() .build(); Request request = new Request.Builder() .url("your tiny url") .build(); // HEAD REQUEST client.newCall(requestHead).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); Log.d("OKHTTP3 onFailure", e.getMessage()); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { try { final ResponseBody _body = response.body(); if (_body != null) { final MediaType _contentType = _body.contentType(); if (_contentType != null) { final String _mainType = _contentType.type(); // image final String _subtypeType = _contentType.subtype(); // jpeg/png/etc. Log.d("OKHTTP3 - media content type", _contentType.toString()); Log.d("OKHTTP3 - media main type", _mainType); Log.d("OKHTTP3 - media sub type", _subtypeType); boolean isImage = _mainType.equals("image"); Log.d("OKHTTP3 - I'VE GOT AN IMAGE", "" + isImage); if (isImage) { Log.d("OKHTTP3 WE HAVE AN IMAGE!", "yay!"); } else { Log.d("OKHTTP3 SKIP CONTENT!", "Buuu!"); } } } } catch (Exception e) { Log.d("OKHTTP3 Interrupted Exception", e.getMessage()); } } }); // GET REQUEST client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); Log.d("OKHTTP3 onFailure", e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { try { final ResponseBody _body = response.body(); final MediaType _contentType = _body.contentType(); final String _mainType = _contentType.type(); // image final String _subtypeType = _contentType.subtype(); // jpeg/png/etc. Log.d("OKHTTP3 - media content type", _contentType.toString()); Log.d("OKHTTP3 - media main type", _mainType); Log.d("OKHTTP3 - media sub type", _subtypeType); boolean isImage = _mainType.equals("image"); Log.d("OKHTTP3 - I'VE GOT AN IMAGE", "" + isImage); if (isImage) { final InputStream inputStream = response.body().byteStream(); final Bitmap bitmap = BitmapFactory.decodeStream(inputStream); runOnUiThread(() -> { helloImageView.setImageBitmap(bitmap); }); } } catch (Exception e) { Log.d("OKHTTP3 Interrupted Exception", e.getMessage()); } } });
Puis appelant
implementation 'com.squareup.okhttp3:okhttp:3.14.0'
Vous entrez votre okhttp
client interceptor
et vous pouvez agir en conséquence.
Si tout ce que vous voulez faire est de vérifier le Content-Type
d'une URL, sans télécharger réellement le contenu, un Une requête HTTP HEAD serait appropriée.
La méthode HEAD est identique à GET sauf que le serveur NE DOIT PAS renvoie un corps de message dans la réponse. La méta-information contenue dans les en-têtes HTTP en réponse à une demande HEAD DEVRAIT être identique aux informations envoyées en réponse à une demande GET. Cette méthode peut être utilisé pour obtenir des méta-informations sur l'entité implicite demande sans transférer l'entité-corps lui-même. Cette méthode est souvent utilisé pour tester les liens hypertextes pour la validité, l'accessibilité, et modification récente.
Vous pouvez le faire avec OkHttp comme suit:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://foo.bar/w23afv") .head() .build(); try { Response response = client.newCall(request).execute(); String contentType = response.header("Content-Type"); boolean image = false; if (contentType != null) { image = contentType.startsWith("image/"); } } catch (IOException e) { // handle error }
Si vous obtenez "Chemin de l'image" sous forme de chaîne, essayez ceci ...
image_extension = image_path.substring(image_path.length() - 3)
puis comparez cette image_extension avec png strong >, jpg et gif
Pourquoi avez-vous besoin de vérifier cela en utilisant
Glide
?stackoverflow.com/questions/30777419 /… Cela vous aide-t-il?