Get file name from URL

JavaFileParsingUrlFilenames

Java Problem Overview


In Java, given a java.net.URL or a String in the form of http://www.example.com/some/path/to/a/file.xml , what is the easiest way to get the file name, minus the extension? So, in this example, I'm looking for something that returns "file".

I can think of several ways to do this, but I'm looking for something that's easy to read and short.

Java Solutions


Solution 1 - Java

Instead of reinventing the wheel, how about using 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
    }

}

Solution 2 - Java

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

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

Solution 3 - Java

If you don't need to get rid of the file extension, here's a way to do it without resorting to error-prone String manipulation and without using external libraries. Works with 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()

Solution 4 - Java

This should about cut it (i'll leave the error handling to you):

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

Solution 5 - Java

One liner:

new File(uri.getPath).getName

Complete code (in a scala 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

Note: URI#gePath is already intelligent enough to strip off query parameters and the protocol's scheme. Examples:

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

Solution 6 - Java

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

Solution 7 - Java

Get File Name with Extension, without Extension, only Extension with just 3 line:

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

Log Result:

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

Hope it will help you.

Solution 8 - Java

There are some ways:

Java 7 File I/O:

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

Apache Commons:

String fileName = FilenameUtils.getName(strUrl);

Using Jersey:

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

Substring:

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

Solution 9 - Java

I've come up with this:

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

Solution 10 - Java

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

Solution 11 - Java

Keep it simple :

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

Solution 12 - Java

Here is the simplest way to do it in Android. I know it will not work in Java but It may help Android application developer.

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

Solution 13 - Java

Create an URL object from the String. When first you have an URL object there are methods to easily pull out just about any snippet of information you need.

I can strongly recommend the Javaalmanac web site which has tons of examples, but which has since moved. You might find http://exampledepot.8waytrips.com/egs/java.io/File2Uri.html interesting:

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

Solution 14 - Java

If you want to get only the filename from a java.net.URL (not including any query parameters), you could use the following function:

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

For example, this input URL:

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

Would be translated to this output String:

image.png

Solution 15 - Java

I've found that some urls when passed directly to FilenameUtils.getName return unwanted results and this needs to be wrapped up to avoid exploits.

For example,

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

returns

> ..

which I doubt anyone wants to allow.

The following function seems to work fine, and shows some of these test cases, and it returns null when the filename can't be determined.

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;
    }
}
This is wrapped up with some simple tests cases in the following example:
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;
    }
  }
}

Solution 16 - Java

Urls can have parameters in the end, this

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

Solution 17 - Java

The Url object in urllib allows you to access the path's unescaped filename. Here are some examples:

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

Solution 18 - Java

If you are using Spring, there is a helper to handle URIs. Here is the solution:

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

Solution 19 - Java

andy's answer redone using split():

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

Solution 20 - Java

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

Solution 21 - Java

How about this:

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


Solution 22 - Java

In order to return filename without extension and without parameters use the following:

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

In order to return filename with extension without params use this:

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

Solution 23 - Java

Beyond the all advanced methods, my simple trick is 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);
	}
}

Solution 24 - Java

return new File(Uri.parse(url).getPath()).getName()

Solution 25 - Java

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

Solution 26 - Java

I have the same problem, with yours. I solved it by this:

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

Solution 27 - Java

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

 }

I hope this will help you.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSietseView Question on Stackoverflow
Solution 1 - JavaAdrian B.View Answer on Stackoverflow
Solution 2 - JavaReal Red.View Answer on Stackoverflow
Solution 3 - JavaZoltánView Answer on Stackoverflow
Solution 4 - JavatehvanView Answer on Stackoverflow
Solution 5 - JavajuanmirocksView Answer on Stackoverflow
Solution 6 - JavaMikeView Answer on Stackoverflow
Solution 7 - JavaHiren PatelView Answer on Stackoverflow
Solution 8 - JavaGiang PhanView Answer on Stackoverflow
Solution 9 - JavaSietseView Answer on Stackoverflow
Solution 10 - JavaYogesh RathiView Answer on Stackoverflow
Solution 11 - JavaTim AutinView Answer on Stackoverflow
Solution 12 - JavaBharat DodejaView Answer on Stackoverflow
Solution 13 - JavaThorbjørn Ravn AndersenView Answer on Stackoverflow
Solution 14 - JavadokasparView Answer on Stackoverflow
Solution 15 - JavaBrad ParksView Answer on Stackoverflow
Solution 16 - JavaSerhii BohutskyiView Answer on Stackoverflow
Solution 17 - JavaEricEView Answer on Stackoverflow
Solution 18 - JavaBenjamin CaureView Answer on Stackoverflow
Solution 19 - JavabobinceView Answer on Stackoverflow
Solution 20 - JavaCampaView Answer on Stackoverflow
Solution 21 - JavaLeonView Answer on Stackoverflow
Solution 22 - JavaChaiaviView Answer on Stackoverflow
Solution 23 - JavaBlasankaView Answer on Stackoverflow
Solution 24 - JavaGangrenaGastritView Answer on Stackoverflow
Solution 25 - JavaPravin BhosaleView Answer on Stackoverflow
Solution 26 - JavaVia Marie InteView Answer on Stackoverflow
Solution 27 - JavaRicardo FelgueirasView Answer on Stackoverflow