URL에서 파일 이름 가져 오기


146

Java 에서의 형식으로 a java.net.URL또는 a Stringhttp://www.example.com/some/path/to/a/file.xml지정하면 확장자를 뺀 파일 이름을 얻는 가장 쉬운 방법은 무엇입니까? 따라서이 예에서는을 반환하는 것을 찾고 "file"있습니다.

나는 이것을 할 수있는 여러 가지 방법을 생각할 수 있지만 읽기 쉽고 짧은 것을 찾고 있습니다.


3
끝에 파일 이름이 필요하거나 파일 이름처럼 보이는 것도 필요하지 않습니다. 이 경우 서버에 file.xml이있을 수도 있고 없을 수도 있습니다.
Miserable Variable

2
이 경우 결과는 빈 문자열이거나 null 일 수 있습니다.
Sietse

1
문제를보다 명확하게 정의해야한다고 생각합니다. URL 끝을 따르는 것은 어떻습니까? .... / abc, .... / abc /, .... / abc.def, .... / abc.def.ghi, .... / abc? def.ghi
변수

2
나는 그것이 분명하다고 생각합니다. URL이 파일을 가리키는 경우 파일 이름에서 확장자를 뺀 파일 이름에 관심이 있습니다. 쿼리 부분이 파일 이름을 벗어납니다.
Sietse

4
파일 이름은 마지막 슬래시 뒤의 URL 부분입니다. 파일 확장자는 마지막 기간 이후 파일 이름의 일부입니다.
Sietse

답변:


189

휠을 재창조하는 대신 Apache 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 버전에서는 최소한 매개 변수로 URL을 수동으로 처리해야합니다. 예 : " example.com/file.xml?date=2010-10-20 "
누가 복음 Quinane

18
FilenameUtils.getName (url)이 더 적합합니다.
ehsun7b

4
JDK를 사용하여 쉽게 솔루션을 쉽게 사용할 수있는 경우 commons-io에 대한 종속성을 추가하는 것은 이상하게 보입니다 ( URL#getPathString#substringor Path#getFileName또는 참조 File#getName).
Jason C

5
FilenameUtils 클래스는 URL이 아닌 Windows 및 * nix 경로와 작동하도록 설계되었습니다.
nhahtdh

4
URL을 사용하고 샘플 출력 값을 표시하며 쿼리 매개 변수를 사용하도록 예제를 업데이트했습니다.
Nick Grealy

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

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

17
왜 공감해야합니까? 불공평 해. 내 코드가 작동합니다. downvote를 본 후 코드를 확인했습니다.
리얼 레드.

2
내 버전보다 약간 더 읽기 쉽기 때문에 당신을 찬성했습니다. downvote는 확장명이 없거나 파일이 없을 때 작동하지 않기 때문일 수 있습니다.
Sietse

1
당신은에 두 번째 매개 변수를 생략 할 수 있습니다substring()
존 Onstott

12
이것은도 작동하지 않습니다 http://example.org/file#anchor, http://example.org/file?p=foo&q=barhttp://example.org/file.xml#/p=foo&q=bar
마티아스 Ronge

2
String url = new URL(original_url).getPath()파일 이름이 포함되지 않은 파일 이름에 특별한 경우를 허용 하고 추가하면 .정상적으로 작동합니다.
Jason C

32

파일 확장자를 제거 할 필요가없는 경우 오류가 발생하기 쉬운 문자열 조작이나 외부 라이브러리를 사용하지 않고 파일 확장자를 제거하는 방법이 있습니다. Java 1.7 이상에서 작동

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 방금 다시 테스트했는데 제대로 작동하는 것 같습니다. URI.getPath()String작동하지 않는 이유를 모르겠습니다
Zoltán

1
Nvm. Java-interop 중에 Clojure가 var-args를 처리하는 방식으로 인해 문제가 발생했음을 알았습니다. Paths / get의 var-args를 처리하기 위해 빈 배열을 전달해야했기 때문에 문자열 오버로드가 작동하지 않았습니다. 에 대한 호출을 제거 getPath하고 대신 URI 오버로드를 사용 하더라도 여전히 작동 합니다.
Carcigenicate

@Carcigenicate은 무슨 뜻 Paths.get(new URI(url))인가요? 저에게는 효과가없는 것 같습니다
Zoltán

getFileName은 안드로이드 API 레벨 26이 필요합니다
마누엘라

26

이것으로 잘라야합니다 (오류 처리를 남겨 두겠습니다).

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
고려해야 할 오류 처리 측면 중 하나는 실수로 파일 이름이없는 URL (예 : http://www.example.com/또는 http://www.example.com/folder/)을 빈 문자열로 전달하면 빈 문자열로 끝나는 것입니다.
rtpHarry

2
코드가 작동하지 않습니다. lastIndexOf이런 식으로 작동하지 않습니다. 그러나 의도는 분명하다.
Robert

프래그먼트 부분에 슬래시가 포함되어 있으면 작동하지 않으며 아파치 커먼즈와 1.7 이후 Java에서이를 달성하는 전용 함수가 있기 때문에 다운 보트
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

짧막 한 농담:

new File(uri.getPath).getName

완전한 코드 (스칼라 REPL에서) :

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

참고 : URI#gePath쿼리 매개 변수와 프로토콜 체계를 제거하기에 충분히 지능적입니다. 예 :

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
좋은 해결책!
CybeX

1
표준 JDK 만 사용하기 때문에 이것이 최선의 선택입니다
Alexandros

11

가져 오기 파일의 확장자 이름 , 확장하지 않고 , 단지 확장 단지 3 라인 :

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

로그 결과 :

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

그것이 도움이되기를 바랍니다.


9

나는 이것을 생각해 냈습니다.

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

또는 파일이없는 URL, 경로 만 있습니다.
Sietse

코드도 정확합니다. 우리는 어쨌든 부정적인 상태를 확인해서는 안됩니다. 당신을위한 공감대. btw 이름 dirk kuyt가 친숙하게 들립니까?
리얼 레드.

8

몇 가지 방법이 있습니다.

Java 7 파일 I / O :

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

아파치 커먼즈 :

String fileName = FilenameUtils.getName(strUrl);

Jersey 사용 :

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

부분 문자열 :

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

불행히도 Java 7 파일 I / O 솔루션이 작동하지 않습니다. 예외가 있습니다. 나는 이것으로 성공 : Paths.get(new URL(strUrl).getFile()).getFileName().toString(); 아이디어 주셔서 감사합니다!
Sergey Nemchinov

7

간단하게 유지하십시오.

/**
 * 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
@AlexNauda Replace url.getFile()로 바꾸고 경로에서 url.toString()작동 #합니다.
Sormuras


5

안드로이드에서 가장 간단한 방법은 다음과 같습니다. 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

문자열에서 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

java.net.URL에서 파일 이름 만 가져 오려면 (쿼리 매개 변수는 포함하지 않음) 다음 함수를 사용할 수 있습니다.

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

예를 들어이 입력 URL은 다음과 같습니다.

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

이 출력 문자열로 변환됩니다.

image.png

2

FilenameUtils.getName원치 않는 결과 를 반환 하기 위해 직접 전달할 때 일부 URL이 발견 되었으며 악용을 피하기 위해이 URL 을 래핑해야합니다.

예를 들어

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

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

/조각으로 나타날 수 있습니다. 잘못된 것을 추출 할 것입니다.
nhahtdh

1

urllibUrl객체 를 사용하면 경로의 이스케이프되지 않은 파일 이름에 액세스 할 수 있습니다. 여기 몇 가지 예가 있어요.

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의 답변은 split ()을 사용하여 다시 수행합니다.

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

이건 어때요:

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

파일 이름을 반환하기 위해 확장자가없는매개 변수없이 다음을 사용 :

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

매개 변수없이 확장자가있는 파일 이름 을 반환 하려면 다음을 사용하십시오.

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

모든 고급 방법 외에도 간단한 요령은 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 을 사용하는 경우 URI를 처리 하는 도우미 가 있습니다. 해결책은 다음과 같습니다.

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

나는 당신과 같은 문제가 있습니다. 나는 이것을 해결했다.

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

자바는 자바 스크립트가 아니다
nathanfranke

-3

수입 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");

 }

이것이 도움이되기를 바랍니다.


2
getFile ()은 당신이 생각하는 것을하지 않습니다. 이 문서에 따르면 실제로 getPath () + getQuery이며 이는 의미가 없습니다. java.sun.com/j2se/1.4.2/docs/api/java/net/URL.html#getFile ()
bobince
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.