使用java下载文件时如何获取原始文件名
当我用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下载一个文件,因此对于不同的服务器/应用
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