URI 方案不是“文件”

Posted

技术标签:

【中文标题】URI 方案不是“文件”【英文标题】:URI scheme is not "file" 【发布时间】:2011-02-20 01:49:09 【问题描述】:

我得到了异常:“URI 方案不是文件”

我正在做的是尝试获取文件的名称,然后从 servlet 中将该文件(从另一台服务器)保存到我的计算机/服务器上。

我有一个名为“url”的字符串,这是我的代码:

url = Streams.asString(stream); //gets the URL from a form on a webpage
System.out.println("This is the URL: "+url);
URI fileUri = new URI(url);

File fileFromUri = new File(fileUri);                   

onlyFile = fileFromUri.getName(); 
URL fileUrl = new URL(url);
InputStream imageStream = fileUrl.openStream();
String fileLoc2 = getServletContext().getRealPath("pics/"+onlyFile);

File newFolder = new File(getServletContext().getRealPath("pics"));
    if(!newFolder.exists())
        newFolder.mkdir();
    
    IOUtils.copy(imageStream, new FileOutputStream("pics/"+onlyFile));
 

导致错误的行是这一行:

File fileFromUri = new File(fileUri);                   

我已经添加了其余的代码,所以你可以看到我想要做什么。

【问题讨论】:

【参考方案1】:

URI“scheme”是出现在“:”之前的东西,例如“http://***.com”中的“http”。

错误消息告诉您new File(fileUri) 仅适用于“file:”URI(指当前系统上的路径名),不适用于“http”等其他方案。

基本上,“file:”URI 是另一种指定File 类路径名的方式。告诉File 使用http 从网络获取文件并不是一种神奇的方式。

【讨论】:

那么你如何使用 FileReader 使用 HTTP 来获取文件呢?【参考方案2】:

您从URL 创建File 的假设在这里是错误的。

您只是不需要从 URL 到 Internet 中的文件创建一个File,这样您就可以得到文件名。

您可以通过像这样解析 URL 来简单地做到这一点:

URL fileUri = new URL("http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/domefisheye/ladybug/fish4.jpg");    
int startIndex = fileUri.toString().lastIndexOf('/');
String fileName = fileUri.toString().substring(startIndex + 1);
System.out.println(fileName);

【讨论】:

以上是关于URI 方案不是“文件”的主要内容,如果未能解决你的问题,请参考以下文章

如何从 URI 获取完整的文件路径

资源文件加载(Pack URI 方案)

如何在批处理文件中将 DOS 路径转换为文件方案 URI

是否有任何关于浏览器允许和不允许文件:方案 URI 的综合文档?

为啥我的 URI 不是分层的? [复制]

如果我有内容 URI 而不是路径,是不是可以在 Android 中使用 Xamarin.Essentials.Launcher 启动文件?