1
votes

Vérifiez si l'URL est une image avec restriction d'extension

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?


2 commentaires

Pourquoi avez-vous besoin de vérifier cela en utilisant Glide ?


stackoverflow.com/questions/30777419 /… Cela vous aide-t-il?


5 Réponses :


0
votes

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 >


0 commentaires

0
votes

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")


0 commentaires

2
votes

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.


0 commentaires

3
votes

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
}


0 commentaires

0
votes

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


0 commentaires