web-dev-qa-db-ja.com

URIスキームは「ファイル」ではありません

例外が発生します:「URIスキームはファイルではありません」

私がやっていることは、ファイルの名前を取得し、そのファイルを(別のサーバーから)サーブレット内からコンピューター/サーバーに保存しようとしています。

私は「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);                   

私がやろうとしていることを確認できるように、残りのコードを追加しました。

13
Ankur

URIの「スキーム」は、「:」の前にあるものです。たとえば、「 http://stackoverflow.com "」の「http」です。

エラーメッセージは、new File(fileUri)が「file:」URI(現在のシステムのパス名を参照するもの)でのみ機能し、「http」のような他のスキームでは機能しないことを示しています。

基本的に、「file:」URIは、Fileクラスへのパス名を指定するもう1つの方法です。これは、Fileにhttpを使用してWebからファイルをフェッチするように指示する魔法の方法ではありません。

27
David Gelhar

FileからURLを作成するというあなたの仮定はここでは間違っています。

URLからインターネット上のファイルへの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);
4
Leni Kirilov