Получить имя файла из URL - PullRequest
131 голосов
/ 03 марта 2009

В Java с java.net.URL или String в виде http://www.example.com/some/path/to/a/file.xml, какой самый простой способ получить имя файла, за исключением расширения? Итак, в этом примере я ищу что-то, что возвращает "file".

Я могу придумать несколько способов сделать это, но я ищу что-то, что легко читать и кратко.

Ответы [ 25 ]

5 голосов
/ 11 октября 2013

Вот самый простой способ сделать это в Android. Я знаю, что это не будет работать в Java, но может помочь разработчику приложений Android.

import android.webkit.URLUtil;

public String getFileNameFromURL(String url) {
    String fileNameWithExtension = null;
    String fileNameWithoutExtension = null;
    if (URLUtil.isValidUrl(url)) {
        fileNameWithExtension = URLUtil.guessFileName(url, null, null);
        if (fileNameWithExtension != null && !fileNameWithExtension.isEmpty()) {
            String[] f = fileNameWithExtension.split(".");
            if (f != null & f.length > 1) {
                fileNameWithoutExtension = f[0];
            }
        }
    }
    return fileNameWithoutExtension;
}
3 голосов
/ 07 июля 2018

Есть несколько способов:

Файловый ввод / вывод Java 7:

String fileName = Paths.get(strUrl).getFileName().toString();

Apache Commons:

String fileName = FilenameUtils.getName(strUrl);

Использование Джерси:

UriBuilder buildURI = UriBuilder.fromUri(strUrl);
URI uri = buildURI.build();
String fileName = Paths.get(uri.getPath()).getFileName();

Substring:

String fileName = strUrl.substring(strUrl.lastIndexOf('/') + 1);
3 голосов
/ 03 марта 2009

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

Я настоятельно рекомендую веб-сайт Javaalmanac, на котором есть множество примеров, но который с тех пор переместился. Вы можете найти http://exampledepot.8waytrips.com/egs/java.io/File2Uri.html интересным:

// Create a file object
File file = new File("filename");

// Convert the file object to a URL
URL url = null;
try {
    // The file need not exist. It is made into an absolute path
    // by prefixing the current working directory
    url = file.toURL();          // file:/d:/almanac1.4/java.io/filename
} catch (MalformedURLException e) {
}

// Convert the URL to a file object
file = new File(url.getFile());  // d:/almanac1.4/java.io/filename

// Read the file contents using the URL
try {
    // Open an input stream
    InputStream is = url.openStream();

    // Read from is

    is.close();
} catch (IOException e) {
    // Could not open the file
}
2 голосов
/ 25 августа 2016

Если вы хотите получить только имя файла из java.net.URL (не включая параметры запроса), вы можете использовать следующую функцию:

public static String getFilenameFromURL(URL url) {
    return new File(url.getPath().toString()).getName();
}

Например, этот входной URL:

"http://example.com/image.png?version=2&modificationDate=1449846324000"

Будет переведено в этот вывод Строка:

image.png
2 голосов
/ 20 декабря 2016

Я обнаружил, что некоторые URL-адреса при передаче непосредственно в FilenameUtils.getName возвращают нежелательные результаты, и их необходимо свернуть, чтобы избежать эксплойтов.

Например,

System.out.println(FilenameUtils.getName("http://www.google.com/.."));

возвращает

..

что я сомневаюсь, что кто-то хочет разрешить.

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

public static String getFilenameFromUrl(String url)
{
    if (url == null)
        return null;

    try
    {
        // Add a protocol if none found
        if (! url.contains("//"))
            url = "http://" + url;

        URL uri = new URL(url);
        String result = FilenameUtils.getName(uri.getPath());

        if (result == null || result.isEmpty())
            return null;

        if (result.contains(".."))
            return null;

        return result;
    }
    catch (MalformedURLException e)
    {
        return null;
    }
}

Это завершено некоторыми простыми тестами в следующем примере:

import java.util.Objects;
import java.net.URL;
import org.apache.commons.io.FilenameUtils;

class Main {

  public static void main(String[] args) {
    validateFilename(null, null);
    validateFilename("", null);
    validateFilename("www.google.com/../me/you?trex=5#sdf", "you");
    validateFilename("www.google.com/../me/you?trex=5 is the num#sdf", "you");
    validateFilename("http://www.google.com/test.png?test", "test.png");
    validateFilename("http://www.google.com", null);
    validateFilename("http://www.google.com#test", null);
    validateFilename("http://www.google.com////", null);
    validateFilename("www.google.com/..", null);
    validateFilename("http://www.google.com/..", null);
    validateFilename("http://www.google.com/test", "test");
    validateFilename("https://www.google.com/../../test.png", "test.png");
    validateFilename("file://www.google.com/test.png", "test.png");
    validateFilename("file://www.google.com/../me/you?trex=5", "you");
    validateFilename("file://www.google.com/../me/you?trex", "you");
  }

  private static void validateFilename(String url, String expectedFilename){
    String actualFilename = getFilenameFromUrl(url);

    System.out.println("");
    System.out.println("url:" + url);
    System.out.println("filename:" + expectedFilename);

    if (! Objects.equals(actualFilename, expectedFilename))
      throw new RuntimeException("Problem, actual=" + actualFilename + " and expected=" + expectedFilename + " are not equal");
  }

  public static String getFilenameFromUrl(String url)
  {
    if (url == null)
      return null;

    try
    {
      // Add a protocol if none found
      if (! url.contains("//"))
        url = "http://" + url;

      URL uri = new URL(url);
      String result = FilenameUtils.getName(uri.getPath());

      if (result == null || result.isEmpty())
        return null;

      if (result.contains(".."))
        return null;

      return result;
    }
    catch (MalformedURLException e)
    {
      return null;
    }
  }
}
1 голос
/ 12 ноября 2017

Объект Url в urllib позволяет получить доступ к неэкранированному имени файла пути. Вот несколько примеров:

String raw = "http://www.example.com/some/path/to/a/file.xml";
assertEquals("file.xml", Url.parse(raw).path().filename());

raw = "http://www.example.com/files/r%C3%A9sum%C3%A9.pdf";
assertEquals("résumé.pdf", Url.parse(raw).path().filename());
1 голос
/ 01 ноября 2013

URL могут иметь параметры в конце, это

 /**
 * Getting file name from url without extension
 * @param url string
 * @return file name
 */
public static String getFileName(String url) {
    String fileName;
    int slashIndex = url.lastIndexOf("/");
    int qIndex = url.lastIndexOf("?");
    if (qIndex > slashIndex) {//if has parameters
        fileName = url.substring(slashIndex + 1, qIndex);
    } else {
        fileName = url.substring(slashIndex + 1);
    }
    if (fileName.contains(".")) {
        fileName = fileName.substring(0, fileName.lastIndexOf("."));
    }

    return fileName;
}
0 голосов
/ 03 марта 2009

импорт java.io. *;

import java.net.*;

public class ConvertURLToFileName{


   public static void main(String[] args)throws IOException{
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   System.out.print("Please enter the URL : ");

   String str = in.readLine();


   try{

     URL url = new URL(str);

     System.out.println("File : "+ url.getFile());
     System.out.println("Converting process Successfully");

   }  
   catch (MalformedURLException me){

      System.out.println("Converting process error");

 }

Надеюсь, это поможет вам.

0 голосов
/ 31 мая 2017

Помимо всех продвинутых методов, мой простой трюк - StringTokenizer:

import java.util.ArrayList;
import java.util.StringTokenizer;

public class URLName {
    public static void main(String args[]){
        String url = "http://www.example.com/some/path/to/a/file.xml";
        StringTokenizer tokens = new StringTokenizer(url, "/");

        ArrayList<String> parts = new ArrayList<>();

        while(tokens.hasMoreTokens()){
            parts.add(tokens.nextToken());
        }
        String file = parts.get(parts.size() -1);
        int dot = file.indexOf(".");
        String fileName = file.substring(0, dot);
        System.out.println(fileName);
    }
}
0 голосов
/ 03 марта 2009

ответ Энди переделан с помощью split ():

Url u= ...;
String[] pathparts= u.getPath().split("\\/");
String filename= pathparts[pathparts.length-1].split("\\.", 1)[0];
...