使用java下载文件时如何获取原始文件名

使用java下载文件时如何获取原始文件名,java,tomcat,apache-commons,Java,Tomcat,Apache Commons,当我用java从URL下载文件时,如何获得原始文件名 File file = new File( "test" ) ; FileUtils.copyURLToFile(URL, file) 因为当我创建文件时,我必须输入一个名称,但在此阶段我还不知道下载文件的原始名称。对于我来说,建议的文件名存储在头文件内容配置中: Content-Disposition: attachment; filename="suggestion.zip" 我正在从nexus下载一个文件,因此对于不同的服务器/应用

当我用java从
URL
下载文件时,如何获得原始文件名

File file = new File( "test" ) ;
FileUtils.copyURLToFile(URL, file)

因为当我创建文件时,我必须输入一个名称,但在此阶段我还不知道下载文件的原始名称。

对于我来说,建议的文件名存储在头文件内容配置中:

Content-Disposition: attachment; filename="suggestion.zip"
我正在从nexus下载一个文件,因此对于不同的服务器/应用程序,它可能存储在不同的头字段中,但使用firefox的firebug等工具很容易找到

以下几行对我来说很好

URL url = new URL(urlString);
// open the connection
URLConnection con = url.openConnection();
// get and verify the header field
String fieldValue = con.getHeaderField("Content-Disposition");
if (fieldValue == null || ! fieldValue.contains("filename=\"")) {
  // no file name there -> throw exception ...
}
// parse the file name from the header field
String filename = fieldValue.substring(fieldValue.indexOf("filename=\"") + 10, fieldValue.length() - 1);
// create file in systems temporary directory
File download = new File(System.getProperty("java.io.tmpdir"), filename);

// open the stream and download
ReadableByteChannel rbc = Channels.newChannel(con.getInputStream());
FileOutputStream fos = new FileOutputStream(download);
try {
  fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
} finally {
  fos.close();
}

您可以获取URL的路径部分(类似于
新URL(URL).getPath()
),然后获取该URL的最后一个组件,但该组件可能不存在,或者最后一个组件可能是类似于目录的组件,因此您必须以某种方式处理这些组件。所有这些都是基于URL的,通常无法获取服务器上的文件名。@blm很遗憾,URL的最后一个组件中没有文件名。另外请查看URL.openConnection和URLConnection.getContentType。服务器可以在内容类型标题中发送建议的文件名(也可以不发送)。你必须自己打开连接,而不是仅仅将URL交给copURLToFile(虽然可能有另一个表单为你做这件事,我还没有看)。是的,它帮助它显示
application/zip
,但我希望它确实是
application/zip
返回的全部内容,没有
filename
参数?如果是这样的话,那么我认为没有任何方法可以满足你的要求。如果URL没有,而服务器没有告诉你,那么你就必须自己想出这个名字。你有什么反馈吗?我现在尝试一下,它可以工作,只是我必须在
子字符串
方法中将
fieldValue.length()-1
更改为
fieldValue.length()-2