Подтвердить что ты не робот

Разбирайте имя файла из URL перед загрузкой файла

Я загружаю файл ePub из URL.

Теперь я хочу реализовать механизм, с помощью которого, если пользователь попытается повторно загрузить тот же файл, он должен получить предупреждение/сообщение об ошибке, и этот файл не должен быть загружен снова.

Чтобы реализовать это, мне нужно проверить имя файла, присутствующего в моей библиотеке, с именем пользователя, который пытается загрузить файл.

Но у меня просто эта ссылка для скачивания, а не имя файла.

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

4b9b3361

Ответ 1

В Android вы можете использовать метод guessFileName():

URLUtil.guessFileName(url, null, null)

В качестве альтернативы, упрощенное решение в Java может быть:

String fileName = url.substring(url.lastIndexOf('/') + 1);

(Предполагается, что ваш URL-адрес имеет формат: http://xxxxxxxxxxxxx/filename.ext)

ОБНОВЛЕНИЕ 23 марта 2018

Этот вопрос получает много просмотров, и кто-то прокомментировал, что мое "простое" решение не работает с определенными URL-адресами, поэтому я почувствовал необходимость улучшить ответ.

Если вы хотите работать с более сложным шаблоном URL, ниже приведен пример решения. Это становится довольно сложным довольно быстро, и я уверен, что есть некоторые странные случаи, которые мое решение все еще не может обработать, но тем не менее здесь это идет:

public static String getFileNameFromURL(String url) {
    if (url == null) {
        return "";
    }
    try {
        URL resource = new URL(url);
        String host = resource.getHost();
        if (host.length() > 0 && url.endsWith(host)) {
            // handle ...example.com
            return "";
        }
    }
    catch(MalformedURLException e) {
        return "";  
    }

    int startIndex = url.lastIndexOf('/') + 1;
    int length = url.length();

    // find end index for ?
    int lastQMPos = url.lastIndexOf('?');
    if (lastQMPos == -1) {
        lastQMPos = length; 
    }

    // find end index for #
    int lastHashPos = url.lastIndexOf('#');
    if (lastHashPos == -1) {
        lastHashPos = length;   
    }

    // calculate the end index
    int endIndex = Math.min(lastQMPos, lastHashPos);
    return url.substring(startIndex, endIndex);
}

Этот метод может обрабатывать следующие типы ввода:

Input: "null" Output: ""
Input: "" Output: ""
Input: "file:///home/user/test.html" Output: "test.html"
Input: "file:///home/user/test.html?id=902" Output: "test.html"
Input: "file:///home/user/test.html#footer" Output: "test.html"
Input: "http://example.com" Output: ""
Input: "http://www.example.com" Output: ""
Input: "http://www.example.txt" Output: ""
Input: "http://example.com/" Output: ""
Input: "http://example.com/a/b/c/test.html" Output: "test.html"
Input: "http://example.com/a/b/c/test.html?param=value" Output: "test.html"
Input: "http://example.com/a/b/c/test.html#anchor" Output: "test.html"
Input: "http://example.com/a/b/c/test.html#anchor?param=value" Output: "test.html"

Вы можете найти весь исходный код здесь: https://ideone.com/uFWxTL

Ответ 3

Держите его простым:

/**
 * This function will take an URL as input and return the file name.
 * <p>Examples :</p>
 * <ul>
 * <li>http://example.com/a/b/c/test.txt -> test.txt</li>
 * <li>http://example.com/ -> an empty string </li>
 * <li>http://example.com/test.txt?param=value -> test.txt</li>
 * <li>http://example.com/test.txt#anchor -> test.txt</li>
 * </ul>
 * 
 * @param url The input URL
 * @return The URL file name
 */
public static String getFileNameFromUrl(URL url) {

    String urlString = url.getFile();

    return urlString.substring(urlString.lastIndexOf('/') + 1).split("\\?")[0].split("#")[0];
}

Ответ 4

Вам действительно не нужно сравнивать имена файлов. Просто создайте объект Файл для файла с абсолютным путем и проверьте, существует ли файл.

protected boolean need2Download(String fileName) {

    File basePath = new File(BOOK_STORE_PATH);

    File fullPath = new File(basePath, fileName);

    if (fullPath.exists())
        return false;
    return true;
}

protected void downloadFile(String url) {
    String fileName = url.substring(url.lastIndexOf('/') + 1);

    if (need2Download(fileName)) {
        // download
    }
}

Ответ 5

Я думаю, что использование URL # getPath() должно упрощать вещи.

public static String getFileNameFromUrl(URL url) {

    String urlPath = url.getPath();

    return urlPath.substring(urlPath.lastIndexOf('/') + 1);
}

См. http://developer.android.com/reference/java/net/URL.html#getPath()

Ответ 6

Получить имя FilenameUtils из FilenameUtils из apache commons-io

URL url = URL(fileUrl)
String fileName = FilenameUtils.getName(url.getPath())

К этому добавьте зависимость commons-io в build.gradle (приложение)

implementation "commons-io:commons-io:2.6"