Используя java, есть ли способ загрузить изображение с веб-сайта, который не имеет расширения в обычном формате? - PullRequest
0 голосов
/ 16 апреля 2020

Со всем кризисом COVID-19, происходящим по всему миру, я решил приступить к маленькому занудному проекту.

Я пытаюсь сделать цифровые копии карт массовыми для волхвов c сбором на игра под названием настольный симулятор ... Я тоже немного заржавел, но хотел бы вернуться к программированию, так почему бы и нет?

, где я сейчас нахожусь: я создал программу (источник ниже), которая в настоящее время предполагается извлечь все изображения с веб-сайта со всеми распространенными расширениями.

РЕДАКТИРОВАТЬ : когда я получаю URL-адрес изображения, у него нет имени файла с подсказкой. Я не понимаю, как извлечь изображение из того, как оно представлено мне. ImageIO.read (imgURL) по какой-то причине возвращает ноль.

Источник кодируется следующим образом:

<a href="../Card/Details.aspx?multiverseid=482864" id="ctl00_ctl00_ctl00_MainContent_SubContent_SubContent_ctl00_listRepeater_ctl00_cardImageLink" onclick="return CardLinkAction(event, this, 'SameWindow');">

<img src="../../Handlers/Image.ashx?multiverseid=482864&amp;type=card" id="ctl00_ctl00_ctl00_MainContent_SubContent_SubContent_ctl00_listRepeater_ctl00_cardImage" style="border-radius:6px;-webkit-border-radius:6px;-moz-border-radius:6px;" width="95" height="132" alt="Abandoned Sarcophagus" border="0">

</a>

Эта ссылка - это то, что поднимает изображение карты ... Я заметил, что новый для меня формат - ".jfif", который я представьте себе новую версию ".jpeg". Я получил этот формат от загрузки прямо из моего браузера. как мне go извлечь его со страницы?

Код не моя собственная идея, я получил это из более старой записи

отредактировано КОД:

        HTMLDocument htmlDoc = (HTMLDocument) htmlKit.createDefaultDocument();
        htmlKit.read(br, htmlDoc, 0);

        for (HTMLDocument.Iterator iterator = htmlDoc.getIterator(HTML.Tag.IMG); iterator.isValid(); iterator.next()) {
            AttributeSet attributes = iterator.getAttributes();
            String imgSrc = (String) attributes.getAttribute(HTML.Attribute.SRC);

            System.out.println(imgSrc);
            if (imgSrc != null && (imgSrc.toLowerCase().endsWith(".jpg") || (imgSrc.toLowerCase().endsWith("type=card") || (imgSrc.endsWith(".jfif")) || (imgSrc.endsWith(".png")) || (imgSrc.endsWith(".jpeg")) || (imgSrc.endsWith(".bmp")) || (imgSrc.endsWith(".ico"))))) {
                System.out.println(imgSrc);
                try {
                    downloadImage(webUrl, imgSrc);
                } catch (IOException ex) {
                    System.out.println(ex.getMessage());
                }
            }

        }
    private static void downloadImage(String url, String imgSrc) throws IOException {
        BufferedImage image = null;
        try {
            if (!(imgSrc.startsWith("http"))) {
                url = url + imgSrc;
            } else {
                url = imgSrc;
            }
            imgSrc = imgSrc.substring(imgSrc.lastIndexOf("/") + 1);
            String imageFormat = null;
            imageFormat = imgSrc.substring(imgSrc.lastIndexOf(".") + 1);
            String imgPath = null;
            imgPath = "/img depository" + imgSrc + "";
            URL imageUrl = new URL(url);
            image = ImageIO.read(imageUrl); // null is returned here!!
            if (image != null) {
                File file = new File(imgPath);
                ImageIO.write(image, imageFormat, file);
                System.out.println("Success!");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

КОНСОЛЬ Выход:

../../Handlers/Image.ashx?multiverseid=482864&type=card
../../Handlers/Image.ashx?multiverseid=482826&type=card
../../Handlers/Image.ashx?multiverseid=482827&type=card
../../Handlers/Image.ashx?multiverseid=482793&type=card
../../Handlers/Image.ashx?multiverseid=482828&type=card
../../Handlers/Image.ashx?multiverseid=482700&type=card
../../Handlers/Image.ashx?multiverseid=484896&type=card
../../Handlers/Image.ashx?multiverseid=482829&type=card
../../Handlers/Image.ashx?multiverseid=484713&type=card
../../Handlers/Image.ashx?multiverseid=482701&type=card
../../Handlers/Image.ashx?multiverseid=482702&type=card
../../Handlers/Image.ashx?multiverseid=482771&type=card
../../Handlers/Image.ashx?multiverseid=482757&type=card
../../Handlers/Image.ashx?multiverseid=482703&type=card
../../Handlers/Image.ashx?multiverseid=482794&type=card
../../Handlers/Image.ashx?multiverseid=482865&type=card
../../Handlers/Image.ashx?multiverseid=482830&type=card
../../Handlers/Image.ashx?multiverseid=482831&type=card
../../Handlers/Image.ashx?multiverseid=482883&type=card
../../Handlers/Image.ashx?multiverseid=482704&type=card
../../Handlers/Image.ashx?multiverseid=484869&type=card
../../Handlers/Image.ashx?multiverseid=482884&type=card
../../Handlers/Image.ashx?multiverseid=482866&type=card
../../Handlers/Image.ashx?multiverseid=482705&type=card
../../Handlers/Image.ashx?multiverseid=482885&type=card
../../Handlers/Image.ashx?multiverseid=482795&type=card
../../Handlers/Image.ashx?multiverseid=482796&type=card
../../Handlers/Image.ashx?multiverseid=482886&type=card
../../Handlers/Image.ashx?multiverseid=482887&type=card
../../Handlers/Image.ashx?multiverseid=484914&type=card
../../Handlers/Image.ashx?multiverseid=484887&type=card
../../Handlers/Image.ashx?multiverseid=482888&type=card
../../Handlers/Image.ashx?multiverseid=482867&type=card
../../Handlers/Image.ashx?multiverseid=482706&type=card
../../Handlers/Image.ashx?multiverseid=484711&type=card
../../Handlers/Image.ashx?multiverseid=482758&type=card
../../Handlers/Image.ashx?multiverseid=484870&type=card
../../Handlers/Image.ashx?multiverseid=482889&type=card
../../Handlers/Image.ashx?multiverseid=484905&type=card
../../Handlers/Image.ashx?multiverseid=482772&type=card
../../Handlers/Image.ashx?multiverseid=484871&type=card
../../Handlers/Image.ashx?multiverseid=482707&type=card
../../Handlers/Image.ashx?multiverseid=482708&type=card
../../Handlers/Image.ashx?multiverseid=482709&type=card
../../Handlers/Image.ashx?multiverseid=482890&type=card
../../Handlers/Image.ashx?multiverseid=484712&type=card
../../Handlers/Image.ashx?multiverseid=482773&type=card
../../Handlers/Image.ashx?multiverseid=482774&type=card
../../Handlers/Image.ashx?multiverseid=482775&type=card
../../Handlers/Image.ashx?multiverseid=482736&type=card
../../Handlers/Image.ashx?multiverseid=482891&type=card
../../Handlers/Image.ashx?multiverseid=482710&type=card
../../Handlers/Image.ashx?multiverseid=482711&type=card
../../Handlers/Image.ashx?multiverseid=482832&type=card
../../Handlers/Image.ashx?multiverseid=482776&type=card
../../Handlers/Image.ashx?multiverseid=482892&type=card
../../Handlers/Image.ashx?multiverseid=482868&type=card
../../Handlers/Image.ashx?multiverseid=482777&type=card
../../Handlers/Image.ashx?multiverseid=482833&type=card
../../Handlers/Image.ashx?multiverseid=482834&type=card
../../Handlers/Image.ashx?multiverseid=482797&type=card
../../Handlers/Image.ashx?multiverseid=484868&type=card
../../Handlers/Image.ashx?multiverseid=484878&type=card
../../Handlers/Image.ashx?multiverseid=482798&type=card
../../Handlers/Image.ashx?multiverseid=482737&type=card
../../Handlers/Image.ashx?multiverseid=484906&type=card
../../Handlers/Image.ashx?multiverseid=484888&type=card
../../Handlers/Image.ashx?multiverseid=482893&type=card
../../Handlers/Image.ashx?multiverseid=482835&type=card
../../Handlers/Image.ashx?multiverseid=484889&type=card
../../Handlers/Image.ashx?multiverseid=482759&type=card
../../Handlers/Image.ashx?multiverseid=482712&type=card
../../Handlers/Image.ashx?multiverseid=482836&type=card
../../Handlers/Image.ashx?multiverseid=484879&type=card
../../Handlers/Image.ashx?multiverseid=482713&type=card
../../Handlers/Image.ashx?multiverseid=484897&type=card
../../Handlers/Image.ashx?multiverseid=482714&type=card
../../Handlers/Image.ashx?multiverseid=482894&type=card
../../Handlers/Image.ashx?multiverseid=482895&type=card
../../Handlers/Image.ashx?multiverseid=482896&type=card
../../Handlers/Image.ashx?multiverseid=482897&type=card
../../Handlers/Image.ashx?multiverseid=482837&type=card
../../Handlers/Image.ashx?multiverseid=482715&type=card
../../Handlers/Image.ashx?multiverseid=482898&type=card
../../Handlers/Image.ashx?multiverseid=482760&type=card
../../Handlers/Image.ashx?multiverseid=484872&type=card
../../Handlers/Image.ashx?multiverseid=482838&type=card
../../Handlers/Image.ashx?multiverseid=482738&type=card
../../Handlers/Image.ashx?multiverseid=484890&type=card
../../Handlers/Image.ashx?multiverseid=482899&type=card
../../Handlers/Image.ashx?multiverseid=482778&type=card
../../Handlers/Image.ashx?multiverseid=482839&type=card
../../Handlers/Image.ashx?multiverseid=482900&type=card
../../Handlers/Image.ashx?multiverseid=484880&type=card
../../Handlers/Image.ashx?multiverseid=482779&type=card
../../Handlers/Image.ashx?multiverseid=482716&type=card
../../Handlers/Image.ashx?multiverseid=484881&type=card
../../Handlers/Image.ashx?multiverseid=482761&type=card
../../Handlers/Image.ashx?multiverseid=482799&type=card
../../Handlers/Image.ashx?multiverseid=482901&type=card
/images/Redesign/Shadow.png
//media.wizards.com/2018/images/magic/gatherer/footerbanner.jpg
/images/Redesign/hasbro_logo.png
/images/Redesign/wizards_logo.png

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Я не знаю, где вы увидели .jfif относительно этой ссылки, потому что я нигде этого не вижу.

Я вижу URL ссылки:
https://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=482864&type=card

При открытии в веб-браузере (для меня FireFox) я вижу, что ответ сервера имеет следующие заголовки HTTP:

Cache-Control: public
Content-Type: image/jpeg
Expires: Fri, 16 Apr 2021 04:30:35 GMT
Server: Microsoft-IIS/8.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Thu, 16 Apr 2020 04:30:35 GMT
Content-Length: 170170

Важная часть - Content-Type со значением image/jpeg, сообщая вам, что содержимое является изображением в формате JPEG.

К сожалению, сервер не предоставляет подсказывающее имя файла, которое могло бы быть таким заголовком:

Content-Disposition: attachment; filename="filename.jpg"

Без этого По предложению сервера вы знаете и понимаете URL-адрес, и вы могли бы например, написать код для присвоения имени файлу из URL-адреса и заголовка Content-Type, назвав файл card482864.jpeg.

1 голос
/ 16 апреля 2020

Я купил коробку четвертого издания, когда она вышла в 1995 году. Я был второкурсником в Массачусетском технологическом институте (Кембридж, Массачусетс), изучая информатику и китайский язык ... Я бросил играть, когда вышел "Мираж" ( 1997) - но я смотрю на это время от времени на Stack-Exchange (у SE есть сайт MTG), а также видео на YouTube ...

В любом случае, этот код загружает ваши изображения - я смог получите .PNG карт волхвов c. Я опубликую два ответа, так как этот Image Downloader из библиотеки, которую вы должны получить из Google-поиска (Torello, Java - HTML), я также опубликую, что делает метод .. .

import Torello.HTML.Tools.Images.ImageScrape;
import java.io.IOException;

public class MTG
{
    public static void main(String[] argv) throws IOException
    {
        String imgURL = "https://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=482867&type=card";
        ImageScrape. downloadImageGuessType(imgURL, "cardMTG", "");
    }
}

Вот содержимое метода "downloadImagesGuessType (...)" Этот метод успешно загружает PNG Image Files в мое окно терминала ... В библиотеке есть Java -Do c Страница документации здесь ... JavaDo c :: Download-Images Примечание. Документация / комментарии к этому коду находятся на веб-сайте. Реальный код сам по себе является слишком очевидным для комментариев, и я надеюсь, что с вами все в порядке. Оставьте комментарий, и я добавлю построчный код-комментарий к методу, приведенному ниже ..

public static final String[] imageExts = { "jpg", "png", "gif", "bmp", "jpeg" };

public static java.lang.String downloadImageGuessType(
                     java.lang.String urlStr,
                     java.lang.String outputFileStr,
                     java.lang.String outputDirectory
)
                     throws java.io.IOException
{
    if (outputDirectory == null)        outputDirectory = "";
    if (outputDirectory.length() > 0)   if (! outputDirectory.endsWith(File.separator)) outputDirectory = outputDirectory + File.separator;

    BufferedImage   image   = ImageIO.read(new URL(urlStr));
    String          ext     = getImageTypeFromURL(urlStr);
    File            f       = null;

    if (ext != null) 
        try {
            String fName = outputFileStr + '.' + ext;
            f = new File(outputDirectory + fName);
            ImageIO.write(image, ext, f);
            return fName;
        } catch (javax.imageio.IIOException e)      { f.delete();   throw e; }
    else
        for (int i=0; i < imageExts.length; i++)
            try {
                f = new File(outputFileStr + '.' + imageExts[i]);
                ImageIO.write(image, imageExts[i], f);
                return outputFileStr + '.' + imageExts[i];
            }
            catch (javax.imageio.IIOException e)    { f.delete();   continue; }

    System.out.println("NOTE: Image " + urlStr + "\nAttempted to save to:" + outputFileStr + "\nFAILED.");
    return null;
}

public static java.lang.String getImageTypeFromURL(java.lang.String urlStr)
{
    if (urlStr == null)                 return null;

    int pos = urlStr.lastIndexOf(".");

    if (pos == -1)                      return null;
    if (pos == urlStr.length() - 1)     return null;

    String s = urlStr.substring(pos + 1).toLowerCase();
    for (int i=0; i < imageExts.length; i++) if (imageExts[i].equals(s)) return imageExts[i];

    return null;
}
...