Проверка наличия файла на удаленном сервере и, если он существует, загрузка его - PullRequest
2 голосов
/ 16 марта 2012

Я недавно пытался создать программу обновления для моей программы.Предполагается, что средство обновления перейдет в Dropbox, просмотрит файлы в папке «public» и решит, существует ли оно.Он работает и может загрузить файл, но не может проверить, существует ли файл.Я видел это и думал, что это решение, но, похоже, оно не работает.

Вот код, который я использую для проверки существования файла:

public static boolean exists(String URLName) {
    try {
        HttpURLConnection.setFollowRedirects(false);
        HttpURLConnection con = (HttpURLConnection) new URL(URLName)
                .openConnection();
        con.setRequestMethod("HEAD");

        return (con.getResponseCode() == HttpURLConnection.HTTP_OK);

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

Однако, кажется, всегда возвращает true.Все файлы, к которым я обращаюсь, начинаются с «App_» и заканчиваются на «.zip».Единственное, что меняется, - это версия в формате #. ###.

Вот полный код того, как я его проверяю:

    public static void main(String[] args) throws IOException,
            InterruptedException {

        double origVersion = 0.008;

        double versionTimes = 0.000;
        while(exists("http://dl.dropbox.com/u/.../" + "App_"+ String.valueOf(origVersion + versionTimes) + ".zip")) {
            versionTimes = round(versionTimes + 0.001);
            //origVersion = round(origVersion + 0.001);


            System.exit(0);

    }
    }
public static boolean exists(String URLName) {
        try {
            HttpURLConnection.setFollowRedirects(false);
            // note : you may also need
            // HttpURLConnection.setInstanceFollowRedirects(false)
            HttpURLConnection con = (HttpURLConnection) new URL(URLName)
                    .openConnection();
            con.setRequestMethod("HEAD");

            return (con.getResponseCode() == HttpURLConnection.HTTP_OK);

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    static double round(double d) {
        DecimalFormat twoDForm = new DecimalFormat("#.###");
        return Double.valueOf(twoDForm.format(d));
    }

Извините зачто ... Этот код был слишком длинным.Тем не мение.Чтобы проверить это, прямо сейчас он проверит, доступна ли версия 0.009.Который это.Его полная версия находится в переменной double origVersion.Теперь, если вы установите origVersion на 0,009, он проверит на 0,01.Это нормально, за исключением того факта, что App_0.01.zip НЕ существует, и, тем не менее, он все еще говорит, что он существует!

Я также изучил wget для решения этой проблемы, запустив wget с аргументами

THEFILENAME --no-proxy --spider

но это тоже не сработало.Может кто-нибудь мне помочь?Я был бы очень признателен.

Я также видел где-то еще, что вы можете установить соединение с файлом, и если он защищен, файл существует.Если нет, то это не так.Однако я понятия не имею, как это сделать.Может кто-нибудь вытащить меня из темноты?

[EDIT]

Кроме того, работает THEFILENAME --no-proxy --spider на wget, и вывел следующее, проверяя версию0.009:

Spider mode enabled. Check if remote file exists.
--2012-03-16 08:59:55--  http://dl.dropbox.com/u/.../....zip
Resolving dl.dropbox.com... 107.21.103.249, 107.20.135.4, 107.20.198.68, ...
Connecting to dl.dropbox.com|107.21.103.249|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 758067 (740K) [application/zip]
Remote file exists.

И при проверке версии 0.01:

Spider mode enabled. Check if remote file exists.
--2012-03-16 09:01:15--  http://dl.dropbox.com/u/.../....zip
Resolving dl.dropbox.com... 107.22.196.64, 50.19.217.32, 174.129.218.194, ...
Connecting to dl.dropbox.com|107.22.196.64|:80... connected.
HTTP request sent, awaiting response... 404 NOT FOUND
Remote file does not exist -- broken link!!!

Я также попытался прочитать вывод wget, используя this и используя if (input.indexOf ("404 НЕ НАЙДЕНО") == -1), но все еще безрезультатно.

1 Ответ

0 голосов
/ 16 марта 2012

Выполнение запроса HEAD - определенно правильный способ проверить, существует ли файл на удаленном сервере.

Я не вижу ничего плохого в вашем exists(String URLName) методе, поэтому я бы проверил, что онпередается URL, который вы считаете.

Странно выглядит эта строка:

versionTimes = round(versionTimes + 0.001);

Вы изменяете значение versionTimes между проверками на существованиефайла и распечатайте ваше сообщение.

...