CodeGym /Kurslar /JAVA 25 SELF /İnternetdən şəkillər yükləyirik

İnternetdən şəkillər yükləyirik

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. Giriş

Fayllar və şəbəkə ilə iş — proqramlaşdırmada ən vacib mövzulardan biridir. Demək olar ki, istənilən müasir tətbiq internetlə necə isə qarşılıqlı əlaqədə olur: məlumatları yükləyir, sorğular göndərir, şəkillər və ya sənədlər alır. Hətta sadə bir proqram, məsələn, çat‑klient və ya musiqi pleyeri belə, mütləq resursların yüklənməsi ilə məşğul olur.

Bu gün bunu Java-da ən vizual və xoş “yük” — şəkillər nümunəsində öyrənəcəyik. Niyə məhz onlar?

  • Dərhal görünür: Əgər hər şey işləyibsə, sadəcə yüklənən faylı açırsınız və şəkli görürsünüz. Bu, ani və anlaşılan nəticədir.
  • Universal bacarıq: Şəkillər sadəcə şəkil deyil, binar məlumatdır — “xam baytlar”. Onlarla işləməyi öyrənməklə siz istənilən şeyi yükləyə biləcəksiniz: sənədlər, video, musiqi, arxivlər. Prinsip eynidir!
  • Real tapşırıqlar: Şəbəkədən resursları yükləmək bacarığı istənilən müasir tətbiqin fundamentidir — sadə divar kağızı yükləyicilərindən tutmuş sosial şəbəkə API-ləri ilə işləyən mürəkkəb sistemlərə qədər.

İki yanaşmanı nəzərdən keçirəcəyik: sürətli “poçt xidməti” — URL vasitəsilə və “peşəkar nəqliyyat şirkəti” — başlıqlara, statuslara və taym-outlara nəzarətlə HttpClient vasitəsilə.

2. Ən sadə üsul: URL sinfi

Java-da şəbəkə ünvanını təmsil edən URL sinfi var. O, əlaqə açmağa və məlumat axını (tip InputStream) əldə etməyə imkan verir. Bu axınla fayl kimi işləyə bilərsiniz: baytları oxumaq, başqa axına köçürmək, mətni kimi emal etmək.

Əslində, URL-dən istifadə brauzerdəki keçiddən diskdəki fayla ən qısa yoldur.

İlk minimal nümunə

Tutaq ki, bir şəkil üçün keçidimiz var:

URL url = new URL("https://example.com/image.jpg");
Files.copy(url.openStream(), Path.of("a.jpg"));

Cəmi iki sətir. Burada nə baş verir?

  1. Şəkilin ünvanını sətir kimi ötürərək URL obyektini yaradırıq.
  2. openStream() metodunu çağırırıq; o, şəbəkə əlaqəsi açır və InputStream axını qaytarır.
  3. Files.copy metodu ilə axının məzmununu "a.jpg" faylına kopyalayırıq.

Nəticə: şəkil internetdən iş qovluğumuza saxlanılır.

transferTo ilə variant

Axından fayla məlumat ötürməyin başqa bir yolu da var:

InputStream in = new URL("https://example.com/image.jpg").openStream();
in.transferTo(Files.newOutputStream(Path.of("b.jpg")));

Burada biz aydın şəkildə deyirik: in axınını götür və transferTo metodu ilə bütün məlumatları "b.jpg" faylını yazan axına “köçür”.

Nəticə eyni olacaq: şəkil diskdə olacaq.

Vacib detallar

Bu yanaşma çox sadədir, amma onun bəzi nüansları var. Birincisi, linkdən nə gəldiyini heç cür yoxlamırıq. Ola bilsin, bu, şəkildir. Amma ola bilər ki, 404 xətası olan HTML-səhifəsidir. Hər iki halda fayl saxlanılacaq. Fərq yalnız sonra, onu şəkil baxış proqramında açmağa çalışanda üzə çıxacaq.

3. Müasir üsul: HttpClient

Java 11-dən etibarən standart kitabxanaya yeni alət — HttpClient daxil edilib. O, HTTP-sorğularını müasir səviyyədə yerinə yetirməyə imkan verir: GET, POST və digər metodlarla işləmək, taym-outları idarə etmək, başlıqlara və statuslara nəzarət etmək, yönləndirmələri emal etmək.

Şəkilləri yükləmək üçün bu xüsusilə faydalıdır: faylın həqiqətən uğurla yükləndiyinə, səhv almadığınıza əmin ola bilərik.

HttpClient ilə minimal nümunə

URI uri = URI.create("https://example.com/image.jpg");   // URI - URL-un daha müasir versiyası

HttpClient client = HttpClient.newHttpClient();          // HttpClient obyektini yaradırıq
HttpRequest request = HttpRequest.newBuilder(uri).build(); // "sorğu" obyektini yaradırıq

HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
Files.write(Path.of("c.jpg"), response.body());

Gəlin addım-addım baxaq:

  1. HttpClient müştərisini yaradırıq.
  2. Göstərilən ünvana HttpRequest sorğusunu qururuq.
  3. Sorğunu göndəririk və cavabı bayt massivi kimi alırıq: HttpResponse.BodyHandlers.ofByteArray().
  4. Bu baytları Files.write metodu ilə — "c.jpg" faylına yazırıq.

Nəticə — eyni şəkil, lakin indi serverin necə cavab verdiyi barədə daha çox məlumatımız var.

Cavab statusunun yoxlanması

response obyektində statusCode() metodu var. Onun vasitəsilə serverin uğurlu cavab qaytardığını yoxlaya bilərsiniz:

if (response.statusCode() == 200)
{
    Files.write(Path.of("ok.jpg"), response.body());
}
else
{
    System.out.println("Xəta: kod " + response.statusCode());
}

İndi dəqiq bilirik ki, saxladığımız məhz gözlədiyimiz fayldır, səhv səhifəsi deyil.

Başlıqların alınması

Tutaq ki, məzmunun növünü yoxlamaq istəyirik:

String type = response.headers().firstValue("Content-Type").orElse("naməlum");
System.out.println("Məzmun tipi: " + type);

Əgər server "image/png" və ya "image/jpeg" qaytarıbsa, deməli bu, doğrudan da şəkildir. Əgər "text/html" gəlibsə, bu, narahatlıq siqnalıdır.

Taym-outlar

Proqramın server uzun cavab verdikdə donmaması üçün məhdudiyyət təyin etmək olar:

URI uri = URI.create("https://example.com/image.jpg");
HttpRequest req = HttpRequest.newBuilder(uri)
    .timeout(Duration.ofSeconds(5))
    .build();

Server 5 saniyə ərzində cavab verməsə, sorğu xəta ilə tamamlanacaq.

Yönləndirmələrin emalı

Bəzən keçidlər fayla birbaşa aparmır, əvvəlcə yönləndirmə səhifəsinə aparır. Avtomatik yönləndirməni belə aktivləşdirmək olar:

HttpClient client = HttpClient.newBuilder()
    .followRedirects(HttpClient.Redirect.NORMAL)
    .build();

4. Praktiki ssenarilər

Bir neçə şəkli ard-arda yükləmək

Çox vaxt tək birini deyil, onlarla və ya yüzlərlə şəkli yükləmək lazım olur. Məsələn, istifadəçilərin avatarlarını və ya məhsul fotolarını saxlayan proqram yazırsınız. HttpClient ilə bunu döngü vasitəsilə etmək olar:

var client = HttpClient.newHttpClient();

String[] urls = {
    "https://example.com/img1.jpg",
    "https://example.com/img2.jpg"
};

for (int i = 0; i < urls.length; i++)
{
    var uri = URI.create(urls[i]);
    var request = HttpRequest.newBuilder(uri).build();
    var response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
    if (response.statusCode() == 200) {
        Files.write(Path.of("img" + i + ".jpg"), response.body());
    }
}

Fayl ölçüsünün yoxlanması

Bəzən şəkildə neçə bayt olduğunu bilmək faydalıdır. Server bunu "Content-Length" başlığında göstərə bilər:

String length = response.headers().firstValue("Content-Length").orElse("?");
System.out.println("Ölçü: " + length + " bayt");

Başlıq yoxdursa, həmişə sadəcə response.body().length götürmək olar.

Şəklin proqramda yüklənməsi və göstərilməsi

Bəzən şəkli təkcə yükləmək deyil, həm də dərhal göstərmək lazımdır. Bunun üçün javax.imageio.ImageIO kitabxanasından istifadə etmək olar:

InputStream in = new URL("https://example.com/pic.png").openStream();
BufferedImage img = ImageIO.read(in);
System.out.println("En: " + img.getWidth() + ", hündürlük: " + img.getHeight());

Beləliklə, şəkli diskinə saxlamadan, birbaşa yaddaşda yoxlaya bilərik.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION