URL'den dosya adını alın


150

Java'da, a java.net.URLveya a Stringşeklinde verilirse http://www.example.com/some/path/to/a/file.xml, uzantı hariç dosya adını almanın en kolay yolu nedir? Yani, bu örnekte, geri dönen bir şey arıyorum "file".

Bunu yapmanın birkaç yolunu düşünebilirim, ancak okuması kolay ve kısa bir şey arıyorum.


3
Sonunda bir dosya adı olması ya da dosya adına benzeyen bir şey olması gerekmediğinin farkındasınız. Bu durumda, sunucuda bir file.xml olabilir veya olmayabilir.
Sefil Değişken

2
bu durumda, sonuç boş bir dize veya boş olabilir.
Sietse

1
Sorunu daha net tanımlamanız gerektiğini düşünüyorum. URLS sonlarını takip etmeye ne dersiniz? .... / abc, .... / abc /, .... / abc.def, .... / abc.def.ghi, .... / abc? def.ghi
Miserable Variable

2
Sanırım oldukça açık. URL bir dosyayı gösteriyorsa, dosya adı eksi uzantı (varsa) ile ilgileniyorum. Sorgu bölümleri dosya adının dışında kalır.
Sietse

4
dosya adı, url'nin son eğik çizgiden sonraki kısmıdır. dosya uzantısı, dosya adının son noktadan sonraki kısmıdır.
Sietse

Yanıtlar:


196

Bunun yerine nasıl Apache kullanımı hakkında, tekerleği yeniden keşfetmek commons-io :

import org.apache.commons.io.FilenameUtils;

public class FilenameUtilTest {

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://www.example.com/some/path/to/a/file.xml?foo=bar#test");

        System.out.println(FilenameUtils.getBaseName(url.getPath())); // -> file
        System.out.println(FilenameUtils.getExtension(url.getPath())); // -> xml
        System.out.println(FilenameUtils.getName(url.getPath())); // -> file.xml
    }

}

2
Commons-io 2.2 sürümünde en azından URL'leri parametrelerle manuel olarak işlemeniz gerekir. Örneğin, " example.com/file.xml?date=2010-10-20 "
Luke Quinane

18
FilenameUtils.getName (url) daha uygun.
ehsun7b

4
Kolay çözümler sadece JDK kullanılarak hazır olduğunda ortak kullanıma açık bir bağımlılık eklemek garip görünüyor (bkz. URL#getPathVe String#substringveya Path#getFileNameveya File#getName).
Jason C

5
FilenameUtils sınıfı, URL ile değil, Windows ve * nix yolu ile çalışmak üzere tasarlanmıştır.
nhahtdh

4
Bir URL kullanmak, örnek çıktı değerlerini göstermek ve sorgu parametrelerini kullanmak için güncellenmiş örnek.
Nick Grealy

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

String fileNameWithoutExtn = fileName.substring(0, fileName.lastIndexOf('.'));

17
Neden olumsuz oy? Bu adil değil. Kodum çalışıyor, olumsuz oyu gördükten sonra kodumu doğruladım.
Gerçek Kırmızı.

2
Size oy verdim çünkü benim versiyonumdan biraz daha okunaklı. Olumsuz oy, uzantı olmadığında veya dosya olmadığında çalışmadığı için olabilir.
Sietse

1
İkinci parametreyi şu şekilde bırakabilirsinizsubstring()
Jon Onstott

12
Bu ne için çalışmaz http://example.org/file#anchor, http://example.org/file?p=foo&q=barne dehttp://example.org/file.xml#/p=foo&q=bar
Matthias Ronge

2
Bir String url = new URL(original_url).getPath()içermeyen dosya adları için özel bir duruma izin verir ve eklerseniz, .bu iyi çalışır.
Jason C

33

Dosya uzantısından kurtulmanız gerekmiyorsa, işte bunu hataya meyilli Dize manipülasyonuna başvurmadan ve harici kitaplıklar kullanmadan yapmanın bir yolu. Java 1.7+ ile çalışır:

import java.net.URI
import java.nio.file.Paths

String url = "http://example.org/file?p=foo&q=bar"
String filename = Paths.get(new URI(url).getPath()).getFileName().toString()

1
@Carcigenicate Tekrar test ettim ve iyi çalışıyor gibi görünüyor. URI.getPath()a döndürüyor String, bu yüzden neden işe yaramayacağını anlamıyorum
Zoltán

1
Nvm. Şimdi anladım ki benim sorunum Clojure'un Java-interop sırasında değişken args'ı nasıl işlediğinden kaynaklanıyor. Dize aşırı yüklemesi çalışmıyordu, çünkü Paths / get değişkeninin değişkenlerini işlemek için boş bir dizinin de geçirilmesi gerekiyordu. Çağrıyı getPathkaldırırsanız ve bunun yerine URI aşırı yüklemesini kullanırsanız yine de çalışır .
Carcigenicate

@Carcigenicate demek istiyorsun Paths.get(new URI(url))? Bu benim için işe yaramıyor gibi görünüyor
Zoltán

getFileName, 26. seviye android api gerektirir
Manuela

26

Bu onu kesmeli (hata işlemeyi size bırakacağım):

int slashIndex = url.lastIndexOf('/');
int dotIndex = url.lastIndexOf('.', slashIndex);
String filenameWithoutExtension;
if (dotIndex == -1) {
  filenameWithoutExtension = url.substring(slashIndex + 1);
} else {
  filenameWithoutExtension = url.substring(slashIndex + 1, dotIndex);
}

1
Dikkate almanız gereken bir hata işleme yönü, yanlışlıkla dosya adı olmayan bir url'yi ( http://www.example.com/veya gibi http://www.example.com/folder/)
iletirseniz

2
Kod çalışmıyor. lastIndexOfbu şekilde çalışmaz. Ancak niyet açıktır.
Robert

Parça parçası eğik çizgi içeriyorsa çalışmayacağı için ve 1.7'den beri apache commons ve Java'da bunu başaran özel işlevler olduğu için olumsuz oy verildi
Zoltán

14
public static String getFileName(URL extUrl) {
        //URL: "http://photosaaaaa.net/photos-ak-snc1/v315/224/13/659629384/s659629384_752969_4472.jpg"
        String filename = "";
        //PATH: /photos-ak-snc1/v315/224/13/659629384/s659629384_752969_4472.jpg
        String path = extUrl.getPath();
        //Checks for both forward and/or backslash 
        //NOTE:**While backslashes are not supported in URL's 
        //most browsers will autoreplace them with forward slashes
        //So technically if you're parsing an html page you could run into 
        //a backslash , so i'm accounting for them here;
        String[] pathContents = path.split("[\\\\/]");
        if(pathContents != null){
            int pathContentsLength = pathContents.length;
            System.out.println("Path Contents Length: " + pathContentsLength);
            for (int i = 0; i < pathContents.length; i++) {
                System.out.println("Path " + i + ": " + pathContents[i]);
            }
            //lastPart: s659629384_752969_4472.jpg
            String lastPart = pathContents[pathContentsLength-1];
            String[] lastPartContents = lastPart.split("\\.");
            if(lastPartContents != null && lastPartContents.length > 1){
                int lastPartContentLength = lastPartContents.length;
                System.out.println("Last Part Length: " + lastPartContentLength);
                //filenames can contain . , so we assume everything before
                //the last . is the name, everything after the last . is the 
                //extension
                String name = "";
                for (int i = 0; i < lastPartContentLength; i++) {
                    System.out.println("Last Part " + i + ": "+ lastPartContents[i]);
                    if(i < (lastPartContents.length -1)){
                        name += lastPartContents[i] ;
                        if(i < (lastPartContentLength -2)){
                            name += ".";
                        }
                    }
                }
                String extension = lastPartContents[lastPartContentLength -1];
                filename = name + "." +extension;
                System.out.println("Name: " + name);
                System.out.println("Extension: " + extension);
                System.out.println("Filename: " + filename);
            }
        }
        return filename;
    }

13

Tek astar:

new File(uri.getPath).getName

Tam kod (bir ölçek REPL'de):

import java.io.File
import java.net.URI

val uri = new URI("http://example.org/file.txt?whatever")

new File(uri.getPath).getName
res18: String = file.txt

Not : URI#gePathzaten sorgu parametrelerini ve protokolün şemasını çıkaracak kadar akıllıdır. Örnekler:

new URI("http://example.org/hey/file.txt?whatever").getPath
res20: String = /hey/file.txt

new URI("hdfs:///hey/file.txt").getPath
res21: String = /hey/file.txt

new URI("file:///hey/file.txt").getPath
res22: String = /hey/file.txt

1
güzel çözüm!
CybeX

1
yalnızca standart JDK kullandığı için bu en iyi seçenektir
Alexandros

11

Get Dosya Uzantısı ile Ad , Uzatma olmadan , sadece Uzatma sadece 3 satır ile:

String urlStr = "http://www.example.com/yourpath/foler/test.png";

String fileName = urlStr.substring(urlStr.lastIndexOf('/')+1, urlStr.length());
String fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf('.'));
String fileExtension = urlStr.substring(urlStr.lastIndexOf("."));

Log.i("File Name", fileName);
Log.i("File Name Without Extension", fileNameWithoutExtension);
Log.i("File Extension", fileExtension);

Günlük Sonucu:

File Name(13656): test.png
File Name Without Extension(13656): test
File Extension(13656): .png

Umarım size yardımcı olur.


9

Ben şunu buldum:

String url = "http://www.example.com/some/path/to/a/file.xml";
String file = url.substring(url.lastIndexOf('/')+1, url.lastIndexOf('.'));

Veya dosya içermeyen URL'lerde sadece bir yol.
Sietse

kodunuz da doğru. Yine de olumsuz koşulları kontrol etmemeliyiz. sizin için bir olumlu oy. btw dirk kuyt adı tanıdık geliyor mu?
Gerçek Kırmızı.


8

Bazı yollar var:

Java 7 Dosyası G / Ç:

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

Apache Commons:

String fileName = FilenameUtils.getName(strUrl);

Jersey Kullanımı:

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

Alt dize:

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

1
Ne yazık ki Java 7 Dosya G / Ç çözümünüz benim için çalışmıyor. Bir istisnam var. Bunu başardım: Paths.get(new URL(strUrl).getFile()).getFileName().toString(); Fikir için teşekkürler!
Sergey Nemchinov

7

Basit tutun:

/**
 * 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];
}

1
Değiştir @AlexNauda url.getFile()ile url.toString()ve ile çalışır #yolunda.
Sormuras

5

İşte bunu Android'de yapmanın en basit yolu. Java'da çalışmayacağını biliyorum ama Android uygulama geliştiricisine yardımcı olabilir.

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

Dizeden bir URL nesnesi oluşturun. Bir URL nesnesine ilk sahip olduğunuzda, ihtiyacınız olan herhangi bir bilgi parçacığını kolayca çıkarmanın yöntemleri vardır.

Tonlarca örneği olan ancak o zamandan beri taşınan Javaalmanac web sitesini şiddetle tavsiye edebilirim. Http://exampledepot.8waytrips.com/egs/java.io/File2Uri.html'yi ilginç bulabilirsiniz :

// 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

Bir java.net.URL'den sadece dosya adını almak istiyorsanız (herhangi bir sorgu parametresi dahil değil), aşağıdaki işlevi kullanabilirsiniz:

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

Örneğin, bu giriş URL'si:

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

Bu çıktı dizesine çevrilecektir:

image.png

2

FilenameUtils.getNameİstenmeyen sonuçları döndürmek için doğrudan iletildiğinde bazı url'lerin bulunduğunu ve açıklardan kaçınmak için bunun sarılması gerektiğini buldum .

Örneğin,

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

İadeler

..

ki kimsenin izin vermek istediğinden şüpheliyim.

Aşağıdaki işlev iyi çalışıyor gibi görünüyor ve bu test durumlarından bazılarını gösteriyor nullve dosya adı belirlenemediğinde geri dönüyor .

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;
    }
}

Bu, aşağıdaki örnekte bazı basit test durumlarıyla tamamlanmıştır:

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

URL'lerin sonunda parametreler olabilir, bu

 /**
 * 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;
}

/parça halinde görünebilir. Yanlış şeyleri çıkaracaksınız.
nhahtdh

1

UrlNesne urllib , yolun çıkış kullanılmayan dosya adı erişmesini sağlar. İşte bazı örnekler:

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());

0

andy'nin cevabı split () kullanılarak yeniden yapıldı:

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

0
public String getFileNameWithoutExtension(URL url) {
    String path = url.getPath();

    if (StringUtils.isBlank(path)) {
        return null;
    }
    if (StringUtils.endsWith(path, "/")) {
        //is a directory ..
        return null;
    }

    File file = new File(url.getPath());
    String fileNameWithExt = file.getName();

    int sepPosition = fileNameWithExt.lastIndexOf(".");
    String fileNameWithOutExt = null;
    if (sepPosition >= 0) {
        fileNameWithOutExt = fileNameWithExt.substring(0,sepPosition);
    }else{
        fileNameWithOutExt = fileNameWithExt;
    }

    return fileNameWithOutExt;
}

0

Buna ne dersin:

String filenameWithoutExtension = null;
String fullname = new File(
    new URI("http://www.xyz.com/some/deep/path/to/abc.png").getPath()).getName();

int lastIndexOfDot = fullname.lastIndexOf('.');
filenameWithoutExtension = fullname.substring(0, 
    lastIndexOfDot == -1 ? fullname.length() : lastIndexOfDot);

0

Dosya adını uzantısız ve parametresiz olarak döndürmek için aşağıdakileri kullanın:

String filenameWithParams = FilenameUtils.getBaseName(urlStr); // may hold params if http://example.com/a?param=yes
return filenameWithParams.split("\\?")[0]; // removing parameters from url if they exist

Paramsız uzantıya sahip dosya adını döndürmek için şunu kullanın:

/** Parses a URL and extracts the filename from it or returns an empty string (if filename is non existent in the url) <br/>
 * This method will work in win/unix formats, will work with mixed case of slashes (forward and backward) <br/>
 * This method will remove parameters after the extension
 *
 * @param urlStr original url string from which we will extract the filename
 * @return filename from the url if it exists, or an empty string in all other cases */
private String getFileNameFromUrl(String urlStr) {
    String baseName = FilenameUtils.getBaseName(urlStr);
    String extension = FilenameUtils.getExtension(urlStr);

    try {
        extension = extension.split("\\?")[0]; // removing parameters from url if they exist
        return baseName.isEmpty() ? "" : baseName + "." + extension;
    } catch (NullPointerException npe) {
        return "";
    }
}

0

Tüm gelişmiş yöntemlerin ötesinde, basit numaram 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

Spring kullanıyorsanız , URI'leri işlemek için bir yardımcı vardır . İşte çözüm:

List<String> pathSegments = UriComponentsBuilder.fromUriString(url).build().getPathSegments();
String filename = pathSegments.get(pathSegments.size()-1);


-1
create a new file with string image path

    String imagePath;
    File test = new File(imagePath);
    test.getName();
    test.getPath();
    getExtension(test.getName());


    public static String getExtension(String uri) {
            if (uri == null) {
                return null;
            }

            int dot = uri.lastIndexOf(".");
            if (dot >= 0) {
                return uri.substring(dot);
            } else {
                // No extension.
                return "";
            }
        }

-1

Bende de aynı sorun var. Bunu şu şekilde çözdüm:

var URL = window.location.pathname; // Gets page name
var page = URL.substring(URL.lastIndexOf('/') + 1); 
console.info(page)

Java JavaScript değil
nathanfranke

-3

import 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");

 }

Umarım bu sana yardımcı olmuştur.


2
getFile () düşündüğünüzü yapmaz. Dokümana göre aslında anlamsız olan getPath () + getQuery. java.sun.com/j2se/1.4.2/docs/api/java/net/URL.html#getFile ()
bobince
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.