当前位置: 首页 > 知识库问答 >
问题:

检查url是否为具有扩展限制的图像

霍襦宗
2023-03-14

如何检查URL是否是必须是PNG、GIF或JPG格式的图像URL

我看到它可以通过以下代码完成:

URLConnection connection = new URL("http://foo.bar/w23afv").openConnection();
String contentType = connection.getHeaderField("Content-Type");
boolean image = contentType.startsWith("image/");

但是,我需要使用GlideOKHttpClient进行检查。

如何使用上面提到的两种技术来实现这一点?

共有3个答案

汲品
2023-03-14

在okHttpClient中,您必须使用以下行作为URL并进行API调用,如果调用成功,那么您可以检查您的条件。

例如:-

 String url = new URL("http://foo.bar/w23afv").toString();
 OkHttpHandler okHttpHandler= new OkHttpHandler();
    okHttpHandler.execute(url);
潘宝
2023-03-14

如果您对<code>HEAD

仅使用< code>okhttp3

implementation 'com.squareup.okhttp3:okhttp:3.14.0'

您可以检查也访问主体ContentType的HEAD请求的标头。

将< code >头检查到< code>onResponse()上

    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());
            }
        }
    });

使用拦截器检查标头:拦截器很好,因为它集中在您检查url的单个位置。

    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();
}

使用Glide v4以及okhttp3

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"

你需要扩展 GlideAppModule

@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();
}

然后打电话

Glide.with(this)
            .load("your tini url")
            .into(helloImageView);

您输入 okhttp 客户端拦截器,就可以采取相应的措施。

陶永望
2023-03-14

如果您只想检查URL的内容类型,而不实际下载内容,则可以使用HTTP头请求。

HEAD方法与GET方法相同,只是服务器不能在响应中返回消息体。响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求发送的信息相同。该方法可用于获取请求所隐含的实体的元信息,而无需传输实体体本身。这种方法通常用于测试超文本链接的有效性、可访问性和最近的修改

您可以使用OkHttp执行此操作,如下所示:

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
}
 类似资料:
  • 问题内容: SASS具有一个称为的功能,该功能允许选择器继承另一个选择器的属性,但不复制属性(如mixins)。 LESS是否也具有此功能? 问题答案: 是的,Less.js推出的V1.4.0。 LESS没有实现SASS和Stylus使用的at- rule()语法,而是实现了伪类语法,这为LESS的实现提供了灵活性,使其可以直接应用于选择器本身或在语句内部。因此,这两个都将起作用: 要么 此外,您

  • 在编写高度可移植的代码时,我正在搜索C90标准以寻找需要注意的事情,同时对编译器供应商的善意不太信任,并且假设如果我做错了事情,我的软件有时可能会杀死某人。假设我有点偏执。 目前我正在考虑“翻译限制”(5.2.4.1 ANSI/ISO 9899:1990)。正如标准和中所指出的:“ansi C是否对程序中的外部变量数量进行了限制?”,这些是符合标准实施的最低要求。另一方面,这意味着,任何实现都不需

  • 问题内容: 我正在使用JAI并使用以下文件创建文件: 我在该行之前检查文件是否存在。但是,如何检查文件是.bmp还是.tiff还是图像文件? 有人知道吗? 问题答案: Image Magick项目具有识别图像的功能,并且有一个用于Image Magick的Java包装器,称为JMagick,我认为您可能需要考虑而不是重新发明轮子: http://www.jmagick.org 我一直在使用Imag

  • 问题内容: JavaScript中是否可以检查字符串是否为URL? 正则表达式被排除在外,因为URL的写法很像;也就是说,它可能没有,或者。 问题答案: 与答案相关的问题: 或来自Devshed的此正则表达式:

  • 现在我想测试我的扩展是否按预期工作。 如何编写测试来验证执行第二个方法的尝试是否会引发带有特定消息的RuntimeException?

  • 问题内容: 有没有办法确保收到的文件中包含图像? 对扩展程序的测试对我来说并不十分安全,因为您可以上传一个并将其扩展名更改为所需的扩展名。 我也尝试使用,但是可能有一些更适合该特定问题的东西。 问题答案: 获取mimetype的本机方法: 对于PHP <5.3,请使用mime_content_type()对于PHP> = 5.3,请使用finfo_open()或mime_content_type(